3 Data QC

3.3 Probes QC

Input:

  • RGSet.RDS
  • beta_mat.RDS

Output:

  • beta_CG_XY_SNPfiltered.RDS

4 Normalization

  • Quantile normalization and BMIQ normalization

Input:

  • beta_CG_XY_SNPfiltered_mat.RDS
  • RGSet.RDS
  • pheno_df.RDS
  • full.annot.RDS

Output:

  • bs.csv
  • pheno_df.RDS
  • QNBMIQ.RDS

4.1 Quantile normalization

4.1.1 Check if sex chrom have higher/lower intensities than autosomes

4.1.1.2 Compare beta values between gender

4.1.1.3 Boxplot of methylation by chromosomes

4.1.1.3.2 by gender

4.1.2 normalization by group

4.1.2.2 normalization

## Perform quantile normalization ...
## [1] 446784     30
## Perform quantile normalization ...
## [1] 10618    30
## Perform quantile normalization ...
## [1] 446784     27
## Perform quantile normalization ...
## [1] 10618    27
## Perform quantile normalization ...
## [1] 62 27

4.2 BMIQ

4.2.1 test percentage of type I and type II probes then normalize the matrix

4.2.1.1 on autosomes

5 Outliers detection - PCA analysis

  • Select most variable probes and perform PCA analysis

Input:

  • GASPARONI_QNBMIQ.rds
  • pheno_df.RDS

Output:

  • GASPARONI_PCs_usingBetas.csv,
  • PCA plots
  • GASPARONI_QNBMIQ_PCfiltered.RDS
  • pheno_df.RDS

5.1 for females

## [1] TRUE
## [1] TRUE

5.2 for males

## [1] TRUE
## [1] TRUE

6 Summary after QC steps

6.1 Data and metadata

6.2 Numbers of samples and probes removed in each step

7 Session information

## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 3.6.2 (2019-12-12)
##  os       macOS Catalina 10.15.4      
##  system   x86_64, darwin15.6.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/New_York            
##  date     2020-05-07                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package                                       * version  date       lib
##  acepack                                         1.4.1    2016-10-29 [1]
##  affy                                            1.64.0   2019-10-29 [1]
##  affyio                                          1.56.0   2019-10-29 [1]
##  annotate                                        1.64.0   2019-10-29 [1]
##  AnnotationDbi                                 * 1.48.0   2019-10-29 [1]
##  AnnotationFilter                                1.10.0   2019-10-29 [1]
##  AnnotationHub                                 * 2.18.0   2019-10-29 [1]
##  askpass                                         1.1      2019-01-13 [1]
##  assertthat                                      0.2.1    2019-03-21 [1]
##  backports                                       1.1.6    2020-04-05 [1]
##  base64                                          2.0      2016-05-10 [1]
##  base64enc                                       0.1-3    2015-07-28 [1]
##  beanplot                                        1.2      2014-09-19 [1]
##  BiasedUrn                                       1.07     2015-12-28 [1]
##  Biobase                                       * 2.46.0   2019-10-29 [1]
##  BiocFileCache                                 * 1.10.2   2019-11-08 [1]
##  BiocGenerics                                  * 0.32.0   2019-10-29 [1]
##  BiocManager                                     1.30.10  2019-11-16 [1]
##  BiocParallel                                  * 1.20.1   2019-12-21 [1]
##  BiocVersion                                     3.10.1   2019-06-06 [1]
##  biomaRt                                         2.42.1   2020-03-26 [1]
##  Biostrings                                    * 2.54.0   2019-10-29 [1]
##  biovizBase                                      1.34.1   2019-12-04 [1]
##  bit                                             1.1-15.2 2020-02-10 [1]
##  bit64                                           0.9-7    2017-05-08 [1]
##  bitops                                          1.0-6    2013-08-17 [1]
##  blob                                            1.2.1    2020-01-20 [1]
##  BSgenome                                        1.54.0   2019-10-29 [1]
##  bsseq                                           1.22.0   2019-10-29 [1]
##  bumphunter                                    * 1.28.0   2019-10-29 [1]
##  callr                                           3.4.3    2020-03-28 [1]
##  cellranger                                      1.1.0    2016-07-27 [1]
##  checkmate                                       2.0.0    2020-02-06 [1]
##  cli                                             2.0.2    2020-02-28 [1]
##  cluster                                       * 2.1.0    2019-06-19 [1]
##  codetools                                       0.2-16   2018-12-24 [1]
##  colorspace                                      1.4-1    2019-03-18 [1]
##  crayon                                          1.3.4    2017-09-16 [1]
##  crosstalk                                       1.1.0.1  2020-03-13 [1]
##  curl                                            4.3      2019-12-02 [1]
##  data.table                                      1.12.8   2019-12-09 [1]
##  DBI                                             1.1.0    2019-12-15 [1]
##  dbplyr                                        * 1.4.3    2020-04-19 [1]
##  DelayedArray                                  * 0.12.3   2020-04-09 [1]
##  DelayedMatrixStats                              1.8.0    2019-10-29 [1]
##  desc                                            1.2.0    2018-05-01 [1]
##  devtools                                        2.3.0    2020-04-10 [1]
##  dichromat                                       2.0-0    2013-01-24 [1]
##  digest                                          0.6.25   2020-02-23 [1]
##  DMRcate                                       * 2.0.7    2020-01-10 [1]
##  DMRcatedata                                   * 2.2.1    2020-02-27 [1]
##  DNAcopy                                         1.60.0   2019-10-29 [1]
##  doParallel                                      1.0.15   2019-08-02 [1]
##  doRNG                                           1.8.2    2020-01-27 [1]
##  dplyr                                         * 0.8.5    2020-03-07 [1]
##  DSS                                             2.34.0   2019-10-29 [1]
##  DT                                              0.13     2020-03-23 [1]
##  edgeR                                           3.28.1   2020-02-26 [1]
##  ellipsis                                        0.3.0    2019-09-20 [1]
##  ensembldb                                       2.10.2   2019-11-20 [1]
##  evaluate                                        0.14     2019-05-28 [1]
##  ExperimentHub                                 * 1.12.0   2019-10-29 [1]
##  fansi                                           0.4.1    2020-01-08 [1]
##  farver                                          2.0.3    2020-01-16 [1]
##  fastmap                                         1.0.1    2019-10-08 [1]
##  FDb.InfiniumMethylation.hg19                  * 2.2.0    2020-03-18 [1]
##  foreach                                       * 1.5.0    2020-03-30 [1]
##  foreign                                         0.8-76   2020-03-03 [1]
##  Formula                                         1.2-3    2018-05-03 [1]
##  fs                                              1.4.1    2020-04-04 [1]
##  genefilter                                      1.68.0   2019-10-29 [1]
##  GenomeInfoDb                                  * 1.22.1   2020-03-27 [1]
##  GenomeInfoDbData                                1.2.2    2020-03-18 [1]
##  GenomicAlignments                               1.22.1   2019-11-12 [1]
##  GenomicFeatures                               * 1.38.2   2020-02-15 [1]
##  GenomicRanges                                 * 1.38.0   2019-10-29 [1]
##  GEOquery                                        2.54.1   2019-11-18 [1]
##  ggplot2                                       * 3.3.0    2020-03-05 [1]
##  ggpubr                                          0.2.5    2020-02-13 [1]
##  ggrepel                                       * 0.8.2    2020-03-08 [1]
##  ggsignif                                        0.6.0    2019-08-08 [1]
##  glue                                            1.4.0    2020-04-03 [1]
##  GO.db                                           3.10.0   2020-03-18 [1]
##  gridExtra                                       2.3      2017-09-09 [1]
##  gtable                                          0.3.0    2019-03-25 [1]
##  gtools                                          3.8.2    2020-03-31 [1]
##  Gviz                                            1.30.3   2020-02-17 [1]
##  HDF5Array                                       1.14.4   2020-04-13 [1]
##  Hmisc                                           4.4-0    2020-03-23 [1]
##  hms                                             0.5.3    2020-01-08 [1]
##  htmlTable                                       1.13.3   2019-12-04 [1]
##  htmltools                                       0.4.0    2019-10-04 [1]
##  htmlwidgets                                     1.5.1    2019-10-08 [1]
##  httpuv                                          1.5.2    2019-09-11 [1]
##  httr                                            1.4.1    2019-08-05 [1]
##  IlluminaHumanMethylation450kanno.ilmn12.hg19  * 0.6.0    2020-03-18 [1]
##  IlluminaHumanMethylation450kmanifest          * 0.4.0    2020-03-18 [1]
##  IlluminaHumanMethylationEPICanno.ilm10b4.hg19   0.6.0    2020-03-18 [1]
##  IlluminaHumanMethylationEPICmanifest            0.3.0    2020-03-18 [1]
##  illuminaio                                    * 0.28.0   2019-10-29 [1]
##  interactiveDisplayBase                          1.24.0   2019-10-29 [1]
##  IRanges                                       * 2.20.2   2020-01-13 [1]
##  iterators                                     * 1.0.12   2019-07-26 [1]
##  jpeg                                            0.1-8.1  2019-10-24 [1]
##  jsonlite                                        1.6.1    2020-02-02 [1]
##  KernSmooth                                      2.23-17  2020-04-26 [1]
##  knitr                                           1.28     2020-02-06 [1]
##  labeling                                        0.3      2014-08-23 [1]
##  later                                           1.0.0    2019-10-04 [1]
##  lattice                                         0.20-41  2020-04-02 [1]
##  latticeExtra                                    0.6-29   2019-12-19 [1]
##  lazyeval                                        0.2.2    2019-03-15 [1]
##  lifecycle                                       0.2.0    2020-03-06 [1]
##  limma                                         * 3.42.2   2020-02-03 [1]
##  locfit                                        * 1.5-9.4  2020-03-25 [1]
##  lumi                                          * 2.38.0   2019-10-29 [1]
##  magrittr                                        1.5      2014-11-22 [1]
##  MASS                                            7.3-51.6 2020-04-26 [1]
##  Matrix                                          1.2-18   2019-11-27 [1]
##  matrixStats                                   * 0.56.0   2020-03-13 [1]
##  mclust                                          5.4.6    2020-04-11 [1]
##  memoise                                         1.1.0    2017-04-21 [1]
##  methylumi                                     * 2.32.0   2019-10-29 [1]
##  mgcv                                            1.8-31   2019-11-09 [1]
##  mime                                            0.9      2020-02-04 [1]
##  minfi                                         * 1.32.0   2019-10-29 [1]
##  missMethyl                                      1.20.4   2020-01-28 [1]
##  multtest                                        2.42.0   2019-10-29 [1]
##  munsell                                         0.5.0    2018-06-12 [1]
##  nleqslv                                         3.3.2    2018-05-17 [1]
##  nlme                                            3.1-147  2020-04-13 [1]
##  nnet                                            7.3-14   2020-04-26 [1]
##  nor1mix                                         1.3-0    2019-06-13 [1]
##  openssl                                         1.4.1    2019-07-18 [1]
##  org.Hs.eg.db                                  * 3.10.0   2020-03-18 [1]
##  permute                                         0.9-5    2019-03-12 [1]
##  pillar                                          1.4.3    2019-12-20 [1]
##  pkgbuild                                        1.0.7    2020-04-25 [1]
##  pkgconfig                                       2.0.3    2019-09-22 [1]
##  pkgload                                         1.0.2    2018-10-29 [1]
##  plyr                                            1.8.6    2020-03-03 [1]
##  png                                             0.1-7    2013-12-03 [1]
##  preprocessCore                                  1.48.0   2019-10-29 [1]
##  prettyunits                                     1.1.1    2020-01-24 [1]
##  processx                                        3.4.2    2020-02-09 [1]
##  progress                                        1.2.2    2019-05-16 [1]
##  promises                                        1.1.0    2019-10-04 [1]
##  ProtGenerics                                    1.18.0   2019-10-29 [1]
##  ps                                              1.3.2    2020-02-13 [1]
##  purrr                                           0.3.4    2020-04-17 [1]
##  quadprog                                        1.5-8    2019-11-20 [1]
##  quantro                                       * 1.20.0   2019-10-29 [1]
##  R.methodsS3                                     1.8.0    2020-02-14 [1]
##  R.oo                                            1.23.0   2019-11-03 [1]
##  R.utils                                         2.9.2    2019-12-08 [1]
##  R6                                              2.4.1    2019-11-12 [1]
##  randomForest                                    4.6-14   2018-03-25 [1]
##  rappdirs                                        0.3.1    2016-03-28 [1]
##  RColorBrewer                                    1.1-2    2014-12-07 [1]
##  Rcpp                                            1.0.4.6  2020-04-09 [1]
##  RCurl                                           1.98-1.2 2020-04-18 [1]
##  readr                                           1.3.1    2018-12-21 [1]
##  readxl                                          1.3.1    2019-03-13 [1]
##  remotes                                         2.1.1    2020-02-15 [1]
##  reshape                                         0.8.8    2018-10-23 [1]
##  reshape2                                      * 1.4.4    2020-04-09 [1]
##  rhdf5                                           2.30.1   2019-11-26 [1]
##  Rhdf5lib                                        1.8.0    2019-10-29 [1]
##  rlang                                           0.4.5    2020-03-01 [1]
##  rmarkdown                                       2.1      2020-01-20 [1]
##  rngtools                                        1.5      2020-01-23 [1]
##  ROC                                           * 1.62.0   2019-10-29 [1]
##  rpart                                           4.1-15   2019-04-12 [1]
##  RPMM                                          * 1.25     2017-02-28 [1]
##  rprojroot                                       1.3-2    2018-01-03 [1]
##  Rsamtools                                       2.2.3    2020-02-23 [1]
##  RSQLite                                         2.2.0    2020-01-07 [1]
##  rstudioapi                                      0.11     2020-02-07 [1]
##  rtracklayer                                     1.46.0   2019-10-29 [1]
##  ruv                                             0.9.7.1  2019-08-30 [1]
##  S4Vectors                                     * 0.24.4   2020-04-09 [1]
##  scales                                        * 1.1.0    2019-11-18 [1]
##  scrime                                          1.3.5    2018-12-01 [1]
##  sesame                                        * 1.4.0    2019-10-29 [1]
##  sesameData                                    * 1.4.0    2019-11-05 [1]
##  sessioninfo                                     1.1.1    2018-11-05 [1]
##  shiny                                           1.4.0.2  2020-03-13 [1]
##  siggenes                                        1.60.0   2019-10-29 [1]
##  sm                                            * 2.2-5.6  2018-09-27 [1]
##  statmod                                         1.4.34   2020-02-17 [1]
##  stringi                                         1.4.6    2020-02-17 [1]
##  stringr                                         1.4.0    2019-02-10 [1]
##  SummarizedExperiment                          * 1.16.1   2019-12-19 [1]
##  survival                                        3.1-12   2020-04-10 [1]
##  testthat                                        2.3.2    2020-03-02 [1]
##  tibble                                          3.0.1    2020-04-20 [1]
##  tidyr                                           1.0.2    2020-01-24 [1]
##  tidyselect                                      1.0.0    2020-01-27 [1]
##  TxDb.Hsapiens.UCSC.hg19.knownGene             * 3.2.2    2020-03-18 [1]
##  usethis                                         1.6.0    2020-04-09 [1]
##  VariantAnnotation                               1.32.0   2019-10-29 [1]
##  vctrs                                           0.2.4    2020-03-10 [1]
##  wateRmelon                                    * 1.30.0   2019-10-29 [1]
##  wheatmap                                        0.1.0    2018-03-15 [1]
##  withr                                           2.2.0    2020-04-20 [1]
##  xfun                                            0.13     2020-04-13 [1]
##  XML                                             3.99-0.3 2020-01-20 [1]
##  xml2                                            1.3.2    2020-04-23 [1]
##  xtable                                          1.8-4    2019-04-21 [1]
##  XVector                                       * 0.26.0   2019-10-29 [1]
##  yaml                                            2.2.1    2020-02-01 [1]
##  zlibbioc                                        1.32.0   2019-10-29 [1]
##  source        
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
## 
## [1] /Library/Frameworks/R.framework/Versions/3.6/Resources/library
LS0tCnRpdGxlOiAiR0FTUEFST05JIGRhdGFzZXQiCmF1dGhvcjogIkxhbnl1IFpoYW5nLCBUaWFnbyBDLiBTaWx2YSwgTGlseSBXYW5nIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWFya2Rvd246Omh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogbHVtZW4KICAgIGhpZ2hsaWdodDoga2F0ZQogICAgdG9jOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogICAgdG9jX2RlcHRoOiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUgICAgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgRGF0YSByZXRyaXZhbAoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KG1pbmZpKQpsaWJyYXJ5KElsbHVtaW5hSHVtYW5NZXRoeWxhdGlvbjQ1MGttYW5pZmVzdCkKbGlicmFyeShJbGx1bWluYUh1bWFuTWV0aHlsYXRpb240NTBrYW5uby5pbG1uMTIuaGcxOSkKYGBgCgpgYGB7Un0KY29ob3J0IDwtICJHQVNQQVJPTkkiCmRhdGEuZGlyIDwtIGZpbGUucGF0aCgiLi4vREFUQVNFVFMiLGNvaG9ydCkgCmRhdGEuZGlyLnRhYmxlIDwtICIuLi9EQVRBU0VUUy9TdW1tYXJ5X1RhYmxlLyIgCmRhdGEuZGlyLnJhdyA8LSAiLi4vLi4vY29NZXRoRE1SX21ldGFBbmFseXNpcy9jb2RlX3ZhbGlkYXRpb24vTWV0YV9hbmFseXNpc19jb2RlL0RBVEFTRVRTL0dBU1BBUk9OSS9zdGVwMl9yZWFkX21pbmZpLyIKZGF0YS5kaXIuYnNmaWx0ZXIgPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwMl9ic0NvbnZGaWx0ZXIvIikgCmRhdGEuZGlyLmNsaW5pY2FsLmZpbHRlciA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXAzX2NsaW5pY2FsX2F2YWlsYWJsZV9maWx0ZXJpbmcvIikgCmRhdGEuZGlyLnByb2Jlcy5xYyA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXA0X3Byb2Jlc1FDX2ZpbHRlcmluZy8iKSAKZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24gPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwNV9ub3JtYWxpemF0aW9uLyIpIApkYXRhLmRpci5wY2EgPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwNl9wY2FfZmlsdGVyaW5nLyIpIApkYXRhLmRpci5uZXVyb24gPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwN19uZXVyb25fY29tcC8iKSAKZGF0YS5kaXIuc2luZ2xlLmNwZy5wdmFsIDwtIGZpbGUucGF0aChkYXRhLmRpciwic3RlcDhfc2luZ2xlX2NwZ19wdmFsLyIpIApkYXRhLmRpci5yZXNpZHVhbHMgPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwOV9yZXNpZHVhbHMvIikgCmRhdGEuZGlyLm1lZGlhbiA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXAxMF9tZWRpYW4vIikgCmZvcihwIGluIGdyZXAoImRpciIsbHMoKSx2YWx1ZSA9IFQpKSBkaXIuY3JlYXRlKGdldChwKSxyZWN1cnNpdmUgPSBUUlVFLHNob3dXYXJuaW5ncyA9IEZBTFNFKQpgYGAKCiMgQ29uZmlybSBzZXggc3RhdHVzCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsID0gVFJVRX0KbG9hZChmaWxlID0gcGFzdGUwKGRhdGEuZGlyLnJhdywgIi9HYXNwYXJvbmkucmRhIikpCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRX0KIyBDcmVhdGUgYSBNZXRoeWxTZXQgb2JqZWN0IGZyb20gUkdTZXQKTVNldCA8LSBwcmVwcm9jZXNzUmF3KFJHU2V0KQoKIyBDcmVhdGUgW0dlbm9taWNdTWV0aHlsU2V0IG9iamVjdApHTXNldCA8LSBtYXBUb0dlbm9tZShNU2V0KQoKIyBHZXQgcHJlZGljdGVkIHNleCBzdGF0dXMKZXN0U2V4IDwtIGdldFNleChHTXNldCkKCiMgQ29tcGFyZSBwcmVkaWN0ZWQgZ2VuZGVyIHdpdGggcGhlbm90eXBlIGdlbmRlcgpyZWFsU2V4IDwtIGRhdGEuZnJhbWUoCiAgc2FtcGxlID0gcGFzdGUocGhlbm9EYXRhJGdlb19hY2Nlc3Npb24sCiAgICAgICAgICAgICAgICAgcGhlbm9EYXRhJHNlbnRyaXhfaWQuY2gxLAogICAgICAgICAgICAgICAgIHBoZW5vRGF0YSRzZW50cml4X3Bvc2l0aW9uLmNoMSwKICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpLAogIHJlYWxTZXggPSBwaGVub0RhdGEkU2V4LmNoMSwKICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKKQpjb21wYXJlU2V4IDwtIG1lcmdlKAogIGFzLmRhdGEuZnJhbWUoZXN0U2V4KSwgcmVhbFNleCwKICBieS54ID0gInJvdy5uYW1lcyIsCiAgYnkueSA9ICJzYW1wbGUiKQoKaWRlbnRpY2FsKGNvbXBhcmVTZXgkcHJlZGljdGVkU2V4LCBjb21wYXJlU2V4JHJlYWxTZXgpCmBgYAoKIyBEYXRhIFFDIAoKIyMgQmlsc3VmaXRlIGNvbnZlcnNpb24gZmlsdGVyaW5nCgpSZW1vdmluZyBzYW1wbGVzIHdpdGggYmlzdWxmaXRlQ29udmVyc2lvbiBsb3dlciB0aGFuIDg4LgoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQpsaWJyYXJ5KHdhdGVSbWVsb24pCmxpYnJhcnkoUlBNTSkKYGBgCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsPVRSVUV9CmxvYWQoZmlsZSA9IHBhc3RlMChkYXRhLmRpci5yYXcsICIvR2FzcGFyb25pLnJkYSIpKQpgYGAKCmBgYHtSfQpwaGVub0RhdGEgPC0gcGhlbm9EYXRhW21hdGNoKHN1YnN0cihjb2xuYW1lcyhSR1NldCksMSwxMCksIHBoZW5vRGF0YSRnZW9fYWNjZXNzaW9uKSxdCm5iLnNhbXBsZXMgPC0gbnJvdyhwaGVub0RhdGEpCm5iLmZlbWFsZS5zYW1wbGVzIDwtIHN1bShwaGVub0RhdGEkU2V4LmNoMSA9PSAiRiIpCm5iLm1hbGUuc2FtcGxlcyA8LSBzdW0ocGhlbm9EYXRhJFNleC5jaDEgPT0gIk0iKQpgYGAKCmBgYHtSfQpicyA8LSBkYXRhLmZyYW1lKGJpc3VsZml0ZUNvbnZlcnNpb24gPSBic2NvbihSR1NldCkpCmJzRmlsdGVyZWRPdXQgPC0gcm93Lm5hbWVzKGJzKVticyRiaXN1bGZpdGVDb252ZXJzaW9uIDwgODhdClJHU2V0IDwtIFJHU2V0WywhY29sbmFtZXMoUkdTZXQpICVpbiUgYnNGaWx0ZXJlZE91dF0KcGhlbm9EYXRhIDwtIHBoZW5vRGF0YVttYXRjaChzdWJzdHIoY29sbmFtZXMoUkdTZXQpLDEsMTApLCBwaGVub0RhdGEkZ2VvX2FjY2Vzc2lvbiksXQoKbmIuc2FtcGxlcy5iYy5maWx0ZXJlZCA8LSBucm93KHBoZW5vRGF0YSkKbmIuZmVtYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgPC0gc3VtKHBoZW5vRGF0YSRTZXguY2gxID09ICJGIikKbmIubWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkIDwtIHN1bShwaGVub0RhdGEkU2V4LmNoMSA9PSAiTSIpCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWw9VFJVRX0KZ2dwdWJyOjpnZ2hpc3RvZ3JhbShicyRiaXN1bGZpdGVDb252ZXJzaW9uLHhsYWIgPSAiYmlzdWxmaXRlIENvbnZlcnNpb24iKQpgYGAKCmBgYHtSLCBldmFsID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0Kc2F2ZShSR1NldCwKICAgICBuYi5zYW1wbGVzLAogICAgIG5iLmZlbWFsZS5zYW1wbGVzLAogICAgIG5iLm1hbGUuc2FtcGxlcywKICAgICBicywKICAgICBwaGVub0RhdGEsCiAgICAgbmIuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICBuYi5mZW1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICBuYi5tYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQsCiAgICAgZmlsZSA9IHBhc3RlMChkYXRhLmRpci5ic2ZpbHRlciwgIi9SR1NldF9ic2ZpbHRlcmVkLnJkYSIpKQpgYGAKCiMjIENsaW5pY2FsIGRhdGEgZmlsdGVyaW5nCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsID0gVFJVRX0KbG9hZChmaWxlID0gcGFzdGUwKGRhdGEuZGlyLmJzZmlsdGVyLCAiL1JHU2V0X2JzZmlsdGVyZWQucmRhIikpCmBgYAoKYGBge1J9CnBoZW5vRGF0YSRicmFha19zdGFnZS5jaDEgPC0gcGhlbm9EYXRhJGJyYWFrX3N0YWdlLmNoMSAlPiUgYXMubnVtZXJpYygpCnBoZW5vRGF0YSRhZ2UuY2gxIDwtIHBoZW5vRGF0YSRhZ2UuY2gxICU+JSBhcy5udW1lcmljKCkKIyMjIFN1YnNldCByb3dzIGFuZCBjb2x1bW5zCnBoZW5vX2RmIDwtIHBoZW5vRGF0YSAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBkcGx5cjo6ZmlsdGVyKAogICAgc291cmNlX25hbWVfY2gxID09ICJGcm9udGFsIENvcnRleCIgJgogICAgICAhaXMubmEocGhlbm9EYXRhJGJyYWFrX3N0YWdlLmNoMSkgJgogICAgICBwaGVub0RhdGEkY2hhcmFjdGVyaXN0aWNzX2NoMSA9PSAiY2VsbCB0eXBlOiBidWxrIgogICkgJT4lIGRwbHlyOjpzZWxlY3QoCiAgICBjKAogICAgICAiZ2VvX2FjY2Vzc2lvbiIsCiAgICAgICJkb25vcl9pZC5jaDEiLAogICAgICAic2VudHJpeF9pZC5jaDEiLAogICAgICAiYWdlLmNoMSIsCiAgICAgICJTZXguY2gxIiwKICAgICAgImJyYWFrX3N0YWdlLmNoMSIKICAgICkKICApCgojIyMgUmVuYW1lIHZhcnMKY29sbmFtZXMocGhlbm9fZGYpIDwtIGMoCiAgInNhbXBsZSIsICJzdWJqZWN0LmlkIiwgInNsaWRlIiwgImFnZS5icmFpbiIsICJzZXgiLCAic3RhZ2UiCikKbmIuc2FtcGxlcy53aXRoLmNsaW5pY2FsIDwtIG5yb3cocGhlbm9fZGYpCm5iLmZlbWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwgPC0gc3VtKHBoZW5vX2RmJHNleCA9PSAiRiIpCm5iLm1hbGUuc2FtcGxlcy53aXRoLmNsaW5pY2FsIDwtIHN1bShwaGVub19kZiRzZXggPT0gIk0iKQpgYGAKCmBgYHtSLCBldmFsID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KIyMgcGhlbm90eXBlIGRhdGFzZXQKc2F2ZShSR1NldCwKICAgICBuYi5zYW1wbGVzLndpdGguY2xpbmljYWwsCiAgICAgbmIuZmVtYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCwKICAgICBuYi5tYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCwKICAgICBwaGVub19kZiwKICAgICBmaWxlID0gcGFzdGUwKGRhdGEuZGlyLmNsaW5pY2FsLmZpbHRlciwgIi9nYXNwYXJvbmlfYnNfYW5kX2NsaW5pY2FsX2ZpbHRlcmVkLnJkYSIpKQpgYGAKCiMjIFByb2JlcyBRQwoKSW5wdXQ6IAoKLSBSR1NldC5SRFMKLSBiZXRhX21hdC5SRFMKCk91dHB1dDogCgotIGJldGFfQ0dfWFlfU05QZmlsdGVyZWQuUkRTCgpgYGB7UiwgaW5jbHVkZT1GQUxTRSwgZXZhbD1UUlVFfQpsb2FkKHBhc3RlMChkYXRhLmRpci5jbGluaWNhbC5maWx0ZXIsICIvZ2FzcGFyb25pX2JzX2FuZF9jbGluaWNhbF9maWx0ZXJlZC5yZGEiKSkKYGBgCgpgYGB7UiwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkobWluZmkpCmxpYnJhcnkoRE1SY2F0ZSkKbGlicmFyeShzZXNhbWUpCmBgYAoKYGBge1J9CiMjIyBGaW5kIHdoaWNoIGNocm9tb3NvbWUgZWFjaCBwcm9iZSBpcyBvbgpiZXRhX21hdCA8LSBiZXRhX21hdCA8LSBnZXRCZXRhKFJHU2V0KQoKcHJvYmVzLmluZm8gPC0gc2VzYW1lRGF0YUdldCgiSE00NTAuaGcxOS5tYW5pZmVzdCIpCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhiZXRhX21hdCkgJT4lIGFzLmNoYXJhY3RlcigpXSAlPiUKICBhcy5kYXRhLmZyYW1lICU+JQogIGRwbHlyOjpzZWxlY3QoYygic2VxbmFtZXMiLCJzdGFydCIsImVuZCIpKQpwcm9iZXMuaW5mbyRzZXFuYW1lcyA8LSBhcy5jaGFyYWN0ZXIocHJvYmVzLmluZm8kc2VxbmFtZXMpCgpuYi5wcm9iZXMgPC0gbnJvdyhwcm9iZXMuaW5mbykKbmIuY2hyQXV0by5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJYIikKbmIuY2hyWS5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJZIikKbmIuY2hyTS5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKYGBgCgpgYGB7Un0KIyMjIHN1YnNldCB0byBwcm9iZXMgd2l0aCBkZXRlY3Rpb24gUCA8PSAwLjAxCmRldFAgPC0gZGV0ZWN0aW9uUChSR1NldCwgdHlwZSA9ICJtK3UiKQpmYWlsZWQuMDEgPC0gZGV0UCA+IDAuMDEKcGFzc2VkUHJvYmVzIDwtIHJvd25hbWVzKGZhaWxlZC4wMSlbcm93TWVhbnMoZmFpbGVkLjAxKSA9PSAwXSAKYmV0YV9tYXQgPC0gYmV0YV9tYXRbcGFzc2VkUHJvYmVzLCBdCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhwcm9iZXMuaW5mbykgJWluJSByb3cubmFtZXMoYmV0YV9tYXQpLF0KCm5iLnByb2Jlcy5kZXRlY3RQIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmRldGVjdFAgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNoclgiKQpuYi5jaHJZLnByb2Jlcy5kZXRlY3RQIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCm5iLmNock0ucHJvYmVzLmRldGVjdFAgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKCiMjIyBrZWVwIG9ubHkgcHJvYmVzIHRoYXQgc3RhcnQgd2l0aCAiY2ciCmJldGFfbWF0IDwtIGJldGFfbWF0W2dyZXAoImNnIixyb3duYW1lcyhiZXRhX21hdCkpLF0KcHJvYmVzLmluZm8gPC0gcHJvYmVzLmluZm9bcm93Lm5hbWVzKHByb2Jlcy5pbmZvKSAlaW4lIHJvdy5uYW1lcyhiZXRhX21hdCksXQoKbmIucHJvYmVzLmRldGVjdFAuY2cgPC0gbnJvdyhwcm9iZXMuaW5mbykKbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZyA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgJWluJSBwYXN0ZTAoImNociIsIDE6MjIpKQpuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWCIpCm5iLmNoclkucHJvYmVzLmRldGVjdFAuY2cgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJZIikKbmIuY2hyTS5wcm9iZXMuZGV0ZWN0UC5jZyA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNock0iKQpgYGAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyMjIGRyb3AgcHJvYmVzIHdoZXJlIFNOUCB3aXRoIE1BRiA+PSAwLjAxIGluIHRoZSBsYXN0IDUgYnAgb2YgdGhlIHByb2JlCmJldGFfbWF0IDwtIHJtU05QYW5kQ0goCiAgb2JqZWN0ID0gYmV0YV9tYXQsCiAgZGlzdCA9IDUsIAogIG1hZmN1dCA9IDAuMDEsIAogIGFuZCA9IFRSVUUsCiAgcm1jcm9zc2h5YiA9IEZBTFNFLAogIHJtWFkgPSBGQUxTRQopCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhwcm9iZXMuaW5mbykgJWluJSByb3cubmFtZXMoYmV0YV9tYXQpLF0KCm5iLnByb2Jlcy5jZy5kbXJjYXRlIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmNnLmRtcmNhdGUgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMuY2cuZG1yY2F0ZSA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNoclgiKQpuYi5jaHJZLnByb2Jlcy5jZy5kbXJjYXRlIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCm5iLmNock0ucHJvYmVzLmNnLmRtcmNhdGUgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKCiMjIyBkcm9wIHByb2JlcyBpbiBjaHJNCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Byb2Jlcy5pbmZvJHNlcW5hbWVzICE9ICJjaHJNIixdCmJldGFfbWF0IDwtIGJldGFfbWF0WwogIHJvdy5uYW1lcyhiZXRhX21hdCkgJWluJSByb3cubmFtZXMocHJvYmVzLmluZm8pLApdCgpuYi5wcm9iZXMuZG1yY2F0ZS5jaHJNIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmRtcmNhdGUuY2hyTSA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgJWluJSBwYXN0ZTAoImNociIsIDE6MjIpKQpuYi5jaHJYLnByb2Jlcy5kbXJjYXRlLmNock0gPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJYIikKbmIuY2hyWS5wcm9iZXMuZG1yY2F0ZS5jaHJNIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpzYXZlKAogIHBoZW5vX2RmLAogIGJldGFfbWF0LAogIG5iLnByb2Jlcy5kZXRlY3RQLAogIG5iLmNockF1dG8ucHJvYmVzLmRldGVjdFAsCiAgbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCwKICBuYi5jaHJZLnByb2Jlcy5kZXRlY3RQLAogIG5iLmNock0ucHJvYmVzLmRldGVjdFAsCiAgbmIucHJvYmVzLmRldGVjdFAuY2csCiAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZywKICBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnLAogIG5iLmNoclkucHJvYmVzLmRldGVjdFAuY2csCiAgbmIuY2hyTS5wcm9iZXMuZGV0ZWN0UC5jZywKICBuYi5wcm9iZXMuY2cuZG1yY2F0ZSwKICBuYi5jaHJBdXRvLnByb2Jlcy5jZy5kbXJjYXRlLAogIG5iLmNoclgucHJvYmVzLmNnLmRtcmNhdGUsCiAgbmIuY2hyWS5wcm9iZXMuY2cuZG1yY2F0ZSwKICBuYi5jaHJNLnByb2Jlcy5jZy5kbXJjYXRlLAogIG5iLnByb2Jlcy5kbXJjYXRlLmNock0sCiAgbmIuY2hyQXV0by5wcm9iZXMuZG1yY2F0ZS5jaHJNLAogIG5iLmNoclgucHJvYmVzLmRtcmNhdGUuY2hyTSwKICBuYi5jaHJZLnByb2Jlcy5kbXJjYXRlLmNock0sCiAgZmlsZSA9IHBhc3RlMChkYXRhLmRpci5wcm9iZXMucWMsICIvYmV0YV9DR19YWV9TTlBmaWx0ZXJlZF9tYXQucmRhIikKKQpgYGAKCiMgTm9ybWFsaXphdGlvbgoKLSBRdWFudGlsZSBub3JtYWxpemF0aW9uIGFuZCBCTUlRIG5vcm1hbGl6YXRpb24KCklucHV0OiAKCi0gYmV0YV9DR19YWV9TTlBmaWx0ZXJlZF9tYXQuUkRTCi0gUkdTZXQuUkRTCi0gcGhlbm9fZGYuUkRTCi0gZnVsbC5hbm5vdC5SRFMKCk91dHB1dDogCgotIGJzLmNzdgotIHBoZW5vX2RmLlJEUwotIFFOQk1JUS5SRFMKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWw9VFJVRX0KbG9hZChwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLnFjLCAiL2JldGFfQ0dfWFlfU05QZmlsdGVyZWRfbWF0LnJkYSIpKQpgYGAKCgojIyBRdWFudGlsZSBub3JtYWxpemF0aW9uCgojIyMgQ2hlY2sgaWYgc2V4IGNocm9tIGhhdmUgaGlnaGVyL2xvd2VyIGludGVuc2l0aWVzIHRoYW4gYXV0b3NvbWVzCgojIyMjIENyZWF0ZSBmdW5jdGlvbiB0byBleHRyYWN0IHNlcGFyYXRlIG1hdHJpeCBmb3IgZWFjaCBjaHJvbW9zb21lCgpgYGB7UiwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkoc2VzYW1lKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKYGBge1J9CnByb2Jlcy5pbmZvIDwtIHNlc2FtZURhdGFHZXQoIkhNNDUwLmhnMTkubWFuaWZlc3QiKQpwcm9iZXMuaW5mbyA8LSBwcm9iZXMuaW5mb1tyb3cubmFtZXMoYmV0YV9tYXQpICU+JSBhcy5jaGFyYWN0ZXIoKV0gJT4lCiAgYXMuZGF0YS5mcmFtZSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoInNlcW5hbWVzIiwic3RhcnQiLCJlbmQiKSkKcHJvYmVzLmluZm8kc2VxbmFtZXMgPC0gYXMuY2hhcmFjdGVyKHByb2Jlcy5pbmZvJHNlcW5hbWVzKQoKZmluZEJldGFDaHIgPC0gZnVuY3Rpb24oZGF0YSwgY2hyb20pewogIGRhdGEgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lICMgaGFzIHRvIHR1cm4gbWF0cml4IGludG8gZGYgZm9yIG5leHQgc3RlcAogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oKSAlPiUgIyB0dXJuIHJvd25hbWVzIHRvIGEgY29sdW1uLCBzbyByb3duYW1lcyB3b24ndCBiZSBkZWxldGVkIGFmdGVyIGZpbHRlcmluZyByb3dzIGluIG5leHQgc3RlcAogICAgZmlsdGVyKHJvd25hbWUgJWluJSByb3cubmFtZXMocHJvYmVzLmluZm9bcHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gY2hyb20sXSkpICU+JQogICAgdGliYmxlOjpjb2x1bW5fdG9fcm93bmFtZXMoKSAlPiUKICAgIGFzLm1hdHJpeCgpCn0KYGBgCgojIyMjIENvbXBhcmUgYmV0YSB2YWx1ZXMgYmV0d2VlbiBnZW5kZXIKCiMjIyMjIG9uIGNoclgKCmBgYHtSfQpiZXRhQ2hyWCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gImNoclgiKQpiZXRhQ2hyWF9sb25nIDwtIGRhdGEuZnJhbWUoCiAgYmV0YSA9IGFzLnZlY3RvcihiZXRhQ2hyWCksCiAgc2FtcGxlID0gcmVwKHN1YnN0cihjb2xuYW1lcyhiZXRhQ2hyWCksIDEsMTApLCBlYWNoID0gbnJvdyhiZXRhQ2hyWCkpLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCmJldGFDaHJYX2xvbmcgPC0gbWVyZ2UoCiAgYmV0YUNoclhfbG9uZywgcGhlbm9fZGZbLCBjKCJzYW1wbGUiLCAic2V4IildLAogIGJ5ID0gInNhbXBsZSIsCiAgc29ydCA9IEZBTFNFCikKICAKZ2dwbG90KGJldGFDaHJYX2xvbmcsCiAgICAgICBhZXMoeCA9IHNhbXBsZSwgeSA9IGJldGEsIGZpbGwgPSBzZXgpKSArCiAgc3RhdF9ib3hwbG90KGdlb20gPSdlcnJvcmJhcicsIHdpZHRoID0gMSwgbGluZXR5cGUgPSAxKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMSwgYWxwaGEgPSAxLCBvdXRsaWVyLnNoYXBlID0gMSwgb3V0bGllci5zaXplID0gMikgKwogIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiAgbGFicyh4ID0gInNleCIsIHkgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICAgICAgIHRpdGxlID0gIkROQSBtZXRoeWxhdGlvbiBsZXZlbCBieSBzZXggb24gY2hyb21vc29tZSBYIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKH5zZXgpCmBgYAoKIyMjIyMgb24gY2hyWQoKYGBge1J9CmJldGFDaHJZIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdCwgY2hyb20gPSAiY2hyWSIpCmJldGFDaHJZX2xvbmcgPC0gZGF0YS5mcmFtZSgKICBiZXRhID0gYXMudmVjdG9yKGJldGFDaHJZKSwKICBzYW1wbGUgPSByZXAoc3Vic3RyKGNvbG5hbWVzKGJldGFDaHJZKSwgMSwxMCksIGVhY2ggPSBucm93KGJldGFDaHJZKSksCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKYmV0YUNocllfbG9uZyA8LSBtZXJnZSgKICBiZXRhQ2hyWV9sb25nLCBwaGVub19kZlssIGMoInNhbXBsZSIsICJzZXgiKV0sCiAgYnkgPSAic2FtcGxlIiwKICBzb3J0ID0gRkFMU0UKKQoKZ2dwbG90KGJldGFDaHJZX2xvbmcsCiAgICAgICBhZXMoeCA9IHNhbXBsZSwgeSA9IGJldGEsIGZpbGwgPSBzZXgpKSArCiAgc3RhdF9ib3hwbG90KGdlb20gPSdlcnJvcmJhcicsIHdpZHRoID0gMSwgbGluZXR5cGUgPSAxKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMSwgYWxwaGEgPSAxLCBvdXRsaWVyLnNoYXBlID0gMSwgb3V0bGllci5zaXplID0gMikgKwogIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiAgbGFicyh4ID0gInNleCIsIHkgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICAgICAgIHRpdGxlID0gIkROQSBtZXRoeWxhdGlvbiBsZXZlbCBieSBzZXggb24gY2hyb21vc29tZSBZIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKH5zZXgpCmBgYAoKIyMjIyBCb3hwbG90IG9mIG1ldGh5bGF0aW9uIGJ5IGNocm9tb3NvbWVzICAKCiMjIyMjIG92ZXJhbGwgIAoKYGBge1J9CmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQpiZXRhQ2hyQXV0b19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNockF1dG8pLCBmdW5jdGlvbihpKXsKICBkYXQgPC0gZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0LCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKYmV0YUNockF1dG9fZGYgPC0gZG8uY2FsbChyYmluZCwgYmV0YUNockF1dG9fbHMpCgpjaHJTZXggPC0gcGFzdGUwKCJjaHIiLCBjKCJYIiwgIlkiKSkKYmV0YUNoclNleF9scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNoclNleCksIGZ1bmN0aW9uKGkpewogIGRhdCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gY2hyU2V4W2ldKQogIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihkYXQpLCBjaHJvbSA9IGNoclNleFtpXSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9KQpiZXRhQ2hyU2V4X2RmIDwtIGRvLmNhbGwocmJpbmQsIGJldGFDaHJTZXhfbHMpCgpiZXRhQ2hyX2RmIDwtIHJiaW5kKGJldGFDaHJBdXRvX2RmLCBiZXRhQ2hyU2V4X2RmKQoKIyAjIE5vIGVub3VnaCBtZW1vcnkgdG8gbG9hZCBhbGwgdGhlIGRhdGEgcG9pbnRzIGFuZCBwbG90IHRoZSBmaWd1cmUsIHNvIHVzZSBmdW5jdGlvbiBib3hwbG90IGluc3RlYWQKIyBnZ3Bsb3QoYmV0YUNocl9kZiwKIyAgICAgICAgYWVzKHggPSBjaHJvbSwgeSA9IGJldGEsIGZpbGwgPSBjaHJvbSkpICsKIyAgIHN0YXRfYm94cGxvdChnZW9tID0nZXJyb3JiYXInLCB3aWR0aCA9IDAuNCwgbGluZXR5cGUgPSAxKSArCiMgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjQsIGFscGhhID0gMSwgb3V0bGllci5zaGFwZSA9IDEsIG91dGxpZXIuc2l6ZSA9IDIpICsKIyAgIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiMgICBsYWJzKHggPSAiY2hyb21vc29tZSB0eXBlIiwgeSA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAojICAgICAgICB0aXRsZSA9ICJETkEgbWV0aHlsYXRpb24gbGV2ZWwgdnMuIGNocm9tb3NvbWUgdHlwZSIpICsKIyAgIHRoZW1lX2J3KCkKCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gYmV0YUNocl9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIikKYGBgCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsID0gRkFMU0V9CnBkZihmaWxlID0gcGFzdGUwKGRhdGEuZGlyLnByb2Jlcy5ub3JtYWxpemF0aW9uLCAiL2JldGFfdnNfY2hyb20ucGRmIikpCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gYmV0YUNocl9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIikKZGV2Lm9mZigpCmBgYAoKIyMjIyMgYnkgZ2VuZGVyICAKCmBgYHtSfQojIyMgc3BsaXQgbWF0cml4IGJ5IHNleCBmaXJzdApiZXRhX21hdF9mZW1hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJGIl1dCmJldGFfbWF0X21hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJNIl1dCgojIyMgZm9yIGZlbWFsZXMKY2hyQXV0byA8LSBwYXN0ZTAoImNociIsIDE6MjIpCmZlbWFsZV9hdXRvX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoY2hyQXV0byksIGZ1bmN0aW9uKGkpewogIGRhdCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfZmVtYWxlLCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKZmVtYWxlX2F1dG9fZGYgPC0gZG8uY2FsbChyYmluZCwgZmVtYWxlX2F1dG9fbHMpCgpmZW1hbGVfc2V4X2RmIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9mZW1hbGUsIGNocm9tID0gImNoclgiKQpmZW1hbGVfc2V4X2RmIDwtIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihmZW1hbGVfc2V4X2RmKSwgY2hyb20gPSAiY2hyb21vc29tZSBYIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKZmVtYWxlX2RmIDwtIHJiaW5kKGZlbWFsZV9hdXRvX2RmLCBmZW1hbGVfc2V4X2RmKQoKYm94cGxvdCgKICBiZXRhIH4gY2hyb20sIGRhdGEgPSBmZW1hbGVfZGYsIHlsYWIgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICBtYWluID0gIkROQSBtZXRoeWxhdGlvbiBvbiBjaHJvbW9zb21lcyBmb3IgZmVtYWxlcyIpCgojIyMgZm9yIG1hbGVzCmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQptYWxlX2F1dG9fbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjaHJBdXRvKSwgZnVuY3Rpb24oaSl7CiAgZGF0IDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKbWFsZV9hdXRvX2RmIDwtIGRvLmNhbGwocmJpbmQsIG1hbGVfYXV0b19scykKCm1hbGVfWF9kZiA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfbWFsZSwgY2hyb20gPSAiY2hyWCIpCm1hbGVfWF9kZiA8LSBkYXRhLmZyYW1lKGJldGEgPSBhcy52ZWN0b3IobWFsZV9YX2RmKSwgY2hyb20gPSAiY2hyb21vc29tZSBYIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKbWFsZV9ZX2RmIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9ICJjaHJZIikKbWFsZV9ZX2RmIDwtIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihtYWxlX1lfZGYpLCBjaHJvbSA9ICJjaHJvbW9zb21lIFkiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgptYWxlX2RmIDwtIHJiaW5kKG1hbGVfYXV0b19kZiwgbWFsZV9YX2RmLCBtYWxlX1lfZGYpCgpib3hwbG90KAogIGJldGEgfiBjaHJvbSwgZGF0YSA9IG1hbGVfZGYsIHlsYWIgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICBtYWluID0gIkROQSBtZXRoeWxhdGlvbiBvbiBjaHJvbW9zb21lcyBmb3IgbWFsZXMiKQpgYGAKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KIyMjIHNhdmUgcGxvdHMKcGRmKGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvYmV0YV92c19jaHJvbV9ieV9nZW5kZXIucGRmIikpCgpib3hwbG90KAogIGJldGEgfiBjaHJvbSwgZGF0YSA9IGZlbWFsZV9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIGZvciBmZW1hbGVzIikKCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gbWFsZV9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIGZvciBtYWxlcyIpCgpkZXYub2ZmKCkKYGBgCgojIyMjIEJveHBsb3Qgb2YgbWV0aHlsYXRpb24gYnkgZ2VuZGVyIG9uIGF1dG9zb21lcywgWCwgWQoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQpsaWJyYXJ5KHF1YW50cm8pCmBgYAoKIyMjIyMgb24gYXV0b3NvbWVzCgpgYGB7Un0KY2hyQXV0byA8LSBwYXN0ZTAoImNociIsIDE6MjIpCmJldGFDaHJBdXRvX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoY2hyQXV0byksIGZ1bmN0aW9uKGkpe2ZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdCwgY2hyb20gPSBjaHJBdXRvW2ldKX0pCmJldGFDaHJBdXRvX2RmIDwtIGRvLmNhbGwocmJpbmQsIGJldGFDaHJBdXRvX2xzKQptYXRib3hwbG90KGJldGFDaHJBdXRvX2RmLAogICAgICAgICAgIGdyb3VwRmFjdG9yID0gcGhlbm9fZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoYXV0b3NvbWVzKSAtIGJlZm9yZSBub3JtYWxpemF0aW9uIikKbGVnZW5kKCdib3R0b20nLAogICAgICAgcGFzdGUwKCJzZXggIiwgbGV2ZWxzKGFzLmZhY3RvcihwaGVub19kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCmBgYAoKIyMjIyMgb24gY2hyWCAKCmBgYHtSfQpiZXRhQ2hyWF9kZiA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gImNoclgiKQptYXRib3hwbG90KGJldGFDaHJYX2RmLAogICAgICAgICAgIGdyb3VwRmFjdG9yID0gcGhlbm9fZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoY2hyb21vc29tZSBYKSAtIGJlZm9yZSBub3JtYWxpemF0aW9uIikKbGVnZW5kKCdib3R0b20nLAogICAgICAgcGFzdGUwKCJzZXggIiwgbGV2ZWxzKGFzLmZhY3RvcihwaGVub19kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCmBgYAoKIyMjIyMgb24gY2hyWQoKYGBge1J9CmJldGFDaHJZX2RmIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdCxjaHJvbSA9ICJjaHJZIikKbWF0Ym94cGxvdChiZXRhQ2hyWV9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWSkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQpgYGAKCiMjIyMjIHNhdmUgcGxvdHMKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KcGRmICgKICBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvYm94UGxvdEJlZm9yZU5vcm1hbGl6YXRpb24ucGRmIikKKQoKbWF0Ym94cGxvdChiZXRhQ2hyQXV0b19kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGF1dG9zb21lcykgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhQ2hyWF9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWCkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhQ2hyWV9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWSkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKZGV2Lm9mZigpCmBgYAoKIyMjIG5vcm1hbGl6YXRpb24gYnkgZ3JvdXAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30KbGlicmFyeShsdW1pKQpgYGAKCiMjIyMgc3BsaXQgYmV0YV9tYXQgaW50byBzdWItbWF0cmljcyBieSBmZW1hbGVzIGF1dG9zb21lcywgZmVtYWxlcyBYLCBtYWxlcyBhdXRvc29tZXMsIG1hbGVzIFgsIG1hbGVzIFkKCmBgYHtSfQojIyMgc3BsaXQgbWF0cml4IGJ5IHNleCBmaXJzdApiZXRhX21hdF9mZW1hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJGIl1dCmJldGFfbWF0X21hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJNIl1dCgojIyMgc3BsaXQgZmVtYWxlIGJldGEgbWF0cml4IGJ5IGNocm9tb3NvbWUgKGF1dG8sIFgpCmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQpiZXRhX21hdF9mZW1hbGVfYXV0b19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNockF1dG8pLCBmdW5jdGlvbihpKXsKICBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfZmVtYWxlLCBjaHJvbSA9IGNockF1dG9baV0pfSkKYmV0YV9tYXRfZmVtYWxlX2F1dG8gPC0gZG8uY2FsbChyYmluZCwgYmV0YV9tYXRfZmVtYWxlX2F1dG9fbHMpCgpiZXRhX21hdF9mZW1hbGVfWCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfZmVtYWxlLCBjaHJvbSA9ICJjaHJYIikKCiMjIyBzcGxpdCBtYWxlIGJldGEgbWF0cml4IGJ5IGNocm9tb3NvbWUgKGF1dG8sIFgsIFkpCmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQpiZXRhX21hdF9tYWxlX2F1dG9fbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjaHJBdXRvKSwgZnVuY3Rpb24oaSl7CiAgZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0X21hbGUsIGNocm9tID0gY2hyQXV0b1tpXSl9KQpiZXRhX21hdF9tYWxlX2F1dG8gPC0gZG8uY2FsbChyYmluZCwgYmV0YV9tYXRfbWFsZV9hdXRvX2xzKQoKYmV0YV9tYXRfbWFsZV9YIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9ICJjaHJYIikKCmJldGFfbWF0X21hbGVfWSA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfbWFsZSwgY2hyb20gPSAiY2hyWSIpCmBgYAoKIyMjIyBub3JtYWxpemF0aW9uIAoKYGBge1IsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIyMgZmVtYWxlIGF1dG9zb21lcwpiZXRhUU5fZmVtYWxlX2F1dG8gPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfZmVtYWxlX2F1dG8sIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fZmVtYWxlX2F1dG8pCgojIyMgZmVtYWxlIGNocm9tb3NvbWUgWApiZXRhUU5fZmVtYWxlX1ggPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfZmVtYWxlX1gsIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fZmVtYWxlX1gpCgojIyMgbWFsZSBhdXRvc29tZXMKYmV0YVFOX21hbGVfYXV0byA8LSBsdW1pTih4Lmx1bWkgPSBiZXRhX21hdF9tYWxlX2F1dG8sIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fbWFsZV9hdXRvKQoKIyMjIG1hbGUgY2hyb21vc29tZSBYCmJldGFRTl9tYWxlX1ggPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfbWFsZV9YLCBtZXRob2QgPSAicXVhbnRpbGUiKQpkaW0oYmV0YVFOX21hbGVfWCkKCiMjIyBtYWxlIGNocm9tb3NvbWUgWQpiZXRhUU5fbWFsZV9ZIDwtIGx1bWlOKHgubHVtaSA9IGJldGFfbWF0X21hbGVfWSwgbWV0aG9kID0gInF1YW50aWxlIikKZGltKGJldGFRTl9tYWxlX1kpCmBgYAoKIyMjIyMgRmVtYWxlIHBsb3RzIGFmdGVyIG5vcm1hbGl6YXRpb24gCgpgYGB7Un0KcGhlbm9fZmVtYWxlX2RmIDwtIHBoZW5vX2RmICU+JSBmaWx0ZXIoc2V4ID09ICJGIikKbWF0Ym94cGxvdChiZXRhUU5fZmVtYWxlX2F1dG8sCiAgICAgICAgICAgZ3JvdXBGYWN0b3IgPSBwaGVub19mZW1hbGVfZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoYXV0b3NvbWVzKSAtIGFmdGVyIG5vcm1hbGl6YXRpb24iKQpsZWdlbmQoJ2JvdHRvbScsCiAgICAgICBwYXN0ZTAoInNleCAiLCBsZXZlbHMoYXMuZmFjdG9yKHBoZW5vX2ZlbWFsZV9kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCgptYXRib3hwbG90KGJldGFRTl9mZW1hbGVfWCwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2ZlbWFsZV9kZiRzZXgsCiAgICAgICAgICAgeGF4dCA9ICJuIiwKICAgICAgICAgICBtYWluID0gIkJldGEgVmFsdWVzIChjaHJvbW9zb21lIFgpIC0gYWZ0ZXIgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZmVtYWxlX2RmJHNleCkpKSwKICAgICAgIGNvbCA9IGMoMTo3KSwgbHR5ID0gMSwgbHdkID0gMywgY2V4ID0gMC43MCkKCmBgYAoKIyMjIyMgTWFsZSBwbG90cyBhZnRlciBub3JtYWxpemF0aW9uIAoKYGBge1J9CnBoZW5vX21hbGVfZGYgPC0gcGhlbm9fZGYgJT4lIGZpbHRlcihzZXggPT0gIk0iKQptYXRib3hwbG90KGJldGFRTl9tYWxlX2F1dG8sCiAgICAgICAgICAgZ3JvdXBGYWN0b3IgPSBwaGVub19tYWxlX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGF1dG9zb21lcykgLSBhZnRlciBub3JtYWxpemF0aW9uIikKbGVnZW5kKCdib3R0b20nLAogICAgICAgcGFzdGUwKCJzZXggIiwgbGV2ZWxzKGFzLmZhY3RvcihwaGVub19tYWxlX2RmJHNleCkpKSwKICAgICAgIGNvbCA9IGMoMTo3KSwgbHR5ID0gMSwgbHdkID0gMywgY2V4ID0gMC43MCkKCm1hdGJveHBsb3QoYmV0YVFOX21hbGVfWCwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX21hbGVfZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoY2hyb21vc29tZSBYKSAtIGFmdGVyIG5vcm1hbGl6YXRpb24iKQpsZWdlbmQoJ2JvdHRvbScsCiAgICAgICBwYXN0ZTAoInNleCAiLCBsZXZlbHMoYXMuZmFjdG9yKHBoZW5vX21hbGVfZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhUU5fbWFsZV9ZLAogICAgICAgICAgIGdyb3VwRmFjdG9yID0gcGhlbm9fbWFsZV9kZiRzZXgsCiAgICAgICAgICAgeGF4dCA9ICJuIiwKICAgICAgICAgICBtYWluID0gIkJldGEgVmFsdWVzIChjaHJvbW9zb21lIFkpIC0gYWZ0ZXIgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fbWFsZV9kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCmBgYAoKIyMgQk1JUQoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQpsaWJyYXJ5KHdhdGVSbWVsb24pCmxpYnJhcnkoUlBNTSkKbGlicmFyeShzZXNhbWUpCmxpYnJhcnkoc2VzYW1lRGF0YSkKbGlicmFyeShzbSkKYGBgCgojIyMgdGVzdCBwZXJjZW50YWdlIG9mIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgdGhlbiBub3JtYWxpemUgdGhlIG1hdHJpeAoKIyMjIyBvbiBhdXRvc29tZXMKCiMjIyMjIGZvciBmZW1hbGVzCgpgYGB7Un0KIyMjIE9yZGVyIGFubm90YXRpb24gaW4gdGhlIHNhbWUgb3JkZXIgYXMgYmV0YSBtYXRyaXgKYW5ub3RUeXBlIDwtIHNlc2FtZURhdGFHZXQoIkhNNDUwLmhnMTkubWFuaWZlc3QiKQphbm5vdFR5cGUkZGVzaWduVHlwZU51bWVyaWMgPC0gaWZlbHNlKGFubm90VHlwZSRkZXNpZ25UeXBlID09ICJJIiwxLDIpCgojIyMgRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzCmJldGFRTkNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0byA8LSBiZXRhUU5fZmVtYWxlX2F1dG9bY29tcGxldGUuY2FzZXMoYmV0YVFOX2ZlbWFsZV9hdXRvWywxXSksIF0KYW5ub3RUeXBlQ29tcGxldGVDb2wxX2ZlbWFsZV9hdXRvIDwtIGFubm90VHlwZVtyb3cubmFtZXMoYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9hdXRvKSwgXQoKc20uZGVuc2l0eS5jb21wYXJlKAogICAgYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9hdXRvWywxXSwKICAgIGFubm90VHlwZUNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0byRkZXNpZ25UeXBlTnVtZXJpYykgKwogIHRpdGxlKG1haW4gPSAiRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIG9uIGZlbWFsZSBhdXRvc29tZXMiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fZmVtYWxlX2F1dG8pLG5hbWVzKGFubm90VHlwZSkpXQp0YWJsZSh0eXBlMTIpCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnNldC5zZWVkKDk0NikKZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gNCkKYmV0YVFOX0JNSVFfZmVtYWxlX2F1dG8gPC0gcGx5cjo6YWFwbHkoCiAgYmV0YVFOX2ZlbWFsZV9hdXRvLCAyLAogIGZ1bmN0aW9uKHgpewogICAgbm9ybV9scyA8LSBCTUlRKHgsIGRlc2lnbi52ID0gdHlwZTEyLCBwbG90cyA9IEZBTFNFKQogICAgcmV0dXJuIChub3JtX2xzJG5iZXRhKQogIH0sLnByb2dyZXNzID0gInRpbWUiLC5wYXJhbGxlbCA9IFRSVUUKKSAlPiUgdCgpCmNvbG5hbWVzKGJldGFRTl9CTUlRX2ZlbWFsZV9hdXRvKSA8LSBzdWJzdHIoY29sbmFtZXMoYmV0YVFOX0JNSVFfZmVtYWxlX2F1dG8pLDEsc3RyaW5ncjo6c3RyX2xlbmd0aChwaGVub19kZiRzYW1wbGUpICU+JSB1bmlxdWUpCmBgYAoKIyMjIyMgZm9yIG1hbGVzCgpgYGB7Un0KIyMjIERlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcwpiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9hdXRvIDwtIGJldGFRTl9tYWxlX2F1dG9bY29tcGxldGUuY2FzZXMoYmV0YVFOX21hbGVfYXV0b1ssMV0pLCBdCmFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX2F1dG8gPC0gYW5ub3RUeXBlW3Jvdy5uYW1lcyhiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9hdXRvKSwgXQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9tYWxlX2F1dG9bLDFdLAogIGFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX2F1dG8kZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBtYWxlIGF1dG9zb21lcyIpCgojIyMgU3VtbWFyeSB0YWJsZQp0eXBlMTIgPC0gYW5ub3RUeXBlJGRlc2lnblR5cGVOdW1lcmljW21hdGNoKHJvd25hbWVzKGJldGFRTl9tYWxlX2F1dG8pLG5hbWVzKGFubm90VHlwZSkpXQp0YWJsZSh0eXBlMTIpCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnNldC5zZWVkKDk0NikKZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gNCkKYmV0YVFOX0JNSVFfbWFsZV9hdXRvIDwtIHBseXI6OmFhcGx5KAogIGJldGFRTl9tYWxlX2F1dG8sIDIsCiAgZnVuY3Rpb24oeCl7CiAgICBub3JtX2xzIDwtIEJNSVEoeCwgZGVzaWduLnYgPSB0eXBlMTIsIHBsb3RzID0gRkFMU0UpCiAgICByZXR1cm4gKG5vcm1fbHMkbmJldGEpCiAgfSwucHJvZ3Jlc3MgPSAidGltZSIsLnBhcmFsbGVsID0gVFJVRQopICU+JSB0KCkKY29sbmFtZXMoYmV0YVFOX0JNSVFfbWFsZV9hdXRvKSA8LSBzdWJzdHIoY29sbmFtZXMoYmV0YVFOX0JNSVFfbWFsZV9hdXRvKSwxLHN0cmluZ3I6OnN0cl9sZW5ndGgocGhlbm9fZGYkc2FtcGxlKSAlPiUgdW5pcXVlKQpgYGAKCiMjIyMgb24gY2hyb21vc29tZSBYCgojIyMjIyBmb3IgZmVtYWxlcwoKYGBge1J9CiMjIyBEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMKYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9YIDwtIGJldGFRTl9mZW1hbGVfWFtjb21wbGV0ZS5jYXNlcyhiZXRhUU5fZmVtYWxlX1hbLDFdKSwgXQphbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX1ggPC0gYW5ub3RUeXBlW3Jvdy5uYW1lcyhiZXRhUU5Db21wbGV0ZUNvbDFfZmVtYWxlX1gpLCBdCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9YWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX1gkZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBmZW1hbGUgY2hyb21vc29tZSBYIikKCiMjIyBTdW1tYXJ5IHRhYmxlCnR5cGUxMiA8LSBhbm5vdFR5cGUkZGVzaWduVHlwZU51bWVyaWNbbWF0Y2gocm93bmFtZXMoYmV0YVFOX2ZlbWFsZV9YKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyMjIGZvciBtYWxlcwoKYGBge1J9CiMjIyBEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMKYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWCA8LSBiZXRhUU5fbWFsZV9YW2NvbXBsZXRlLmNhc2VzKGJldGFRTl9tYWxlX1hbLDFdKSwgXQphbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9YIDwtIGFubm90VHlwZVtyb3cubmFtZXMoYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWCksIF0KCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9YWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9YJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gbWFsZSBjaHJvbW9zb21lIFgiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fbWFsZV9YKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyMgb24gY2hyb21vc29tZSBZCgpgYGB7Un0KIyMjIERlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcwpiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9ZIDwtIGJldGFRTl9tYWxlX1lbY29tcGxldGUuY2FzZXMoYmV0YVFOX21hbGVfWVssMV0pLCBdCmFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX1kgPC0gYW5ub3RUeXBlW3Jvdy5uYW1lcyhiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9ZKSwgXQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9tYWxlX1lbLDFdLAogIGFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX1kkZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBjaHJvbW9zb21lIFkiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fbWFsZV9ZKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyBzYXZlIGRlbnNpdHkgcGxvdHMgYW5kIG5vcm1hbGl6ZWQgZGF0YXNldHMKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KIyMjIHNhdmUgcGxvdHMKcGRmKHBhc3RlMChkYXRhLmRpci5wcm9iZXMubm9ybWFsaXphdGlvbiwgIi9kZW5zaXR5UGxvdEJ5UHJvYmVUeXBlLnBkZiIpKQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0b1ssMV0sCiAgYW5ub3RUeXBlQ29tcGxldGVDb2wxX2ZlbWFsZV9hdXRvJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gZmVtYWxlIGF1dG9zb21lcyIpCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfYXV0b1ssMV0sCiAgYW5ub3RUeXBlQ29tcGxldGVDb2wxX21hbGVfYXV0byRkZXNpZ25UeXBlTnVtZXJpYwopCnRpdGxlKG1haW4gPSAiRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIG9uIG1hbGUgYXV0b3NvbWVzIikKCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfZmVtYWxlX1hbLDFdLAogIGFubm90VHlwZUNvbXBsZXRlQ29sMV9mZW1hbGVfWCRkZXNpZ25UeXBlTnVtZXJpYwopCnRpdGxlKG1haW4gPSAiRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIG9uIGZlbWFsZSBjaHJvbW9zb21lIFgiKQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9tYWxlX1hbLDFdLAogIGFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX1gkZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBtYWxlIGNocm9tb3NvbWUgWCIpCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWVssMV0sCiAgYW5ub3RUeXBlQ29tcGxldGVDb2wxX21hbGVfWSRkZXNpZ25UeXBlTnVtZXJpYwopCnRpdGxlKG1haW4gPSAiRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIG9uIGNocm9tb3NvbWUgWSIpCgpkZXYub2ZmKCkKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFfQojIyMgY29tYmluZWQgbm9ybWFsaXplZCBtYXRyaWNlcwpiZXRhUU5fQk1JUV9mZW1hbGUgPC0gcmJpbmQoYmV0YVFOX0JNSVFfZmVtYWxlX2F1dG8sIGJldGFRTl9mZW1hbGVfWCkKYmV0YVFOX0JNSVFfbWFsZSA8LSByYmluZChiZXRhUU5fQk1JUV9tYWxlX2F1dG8sIGJldGFRTl9tYWxlX1gsIGJldGFRTl9tYWxlX1kpCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpzYXZlKGJldGFRTl9CTUlRX2ZlbWFsZSwgYmV0YVFOX0JNSVFfbWFsZSwgcGhlbm9fZGYsIGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvR0FTUEFST05JX1FOQk1JUS5yZGEiKSkKYGBgCgojIE91dGxpZXJzIGRldGVjdGlvbiAtIFBDQSBhbmFseXNpcwoKLSBTZWxlY3QgbW9zdCB2YXJpYWJsZSBwcm9iZXMgYW5kIHBlcmZvcm0gUENBIGFuYWx5c2lzCgpJbnB1dDogCgotIEdBU1BBUk9OSV9RTkJNSVEucmRzICAKLSBwaGVub19kZi5SRFMgIAoKT3V0cHV0OiAKCi0gR0FTUEFST05JX1BDc191c2luZ0JldGFzLmNzdiwgCi0gUENBIHBsb3RzCi0gR0FTUEFST05JX1FOQk1JUV9QQ2ZpbHRlcmVkLlJEUwotIHBoZW5vX2RmLlJEUwoKYGBge1IsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIHBsb3RQQ0EgYW5kIE9yZGVyRGF0YUJ5U2QgZnVuY3Rpb25zCmRldnRvb2xzOjpzb3VyY2VfZ2lzdCgiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdGlhZ29jaHN0L2QzYTdiMTYzOWFjZjYwMzkxNmMzMTVkMjNiMWVmYjNlIikKYGBgCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsPVRSVUV9CiMjIyBtZXJnZSBpbiBncm91cCBpbmZvCiMjIGFkZCBjZW50ZXIgYW5kIHNjYWxlCiMjIGNvbXBhcmUgTSB2YWx1ZXMgdnMuIGJldGEgdmFsdWVzCiMjIHdpdGggYW5kIHdpdGhvdXQgY2VudGVyIC8gc2NhbGUKbG9hZChwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvR0FTUEFST05JX1FOQk1JUS5yZGEiKSkKYGBgCgojIyBmb3IgZmVtYWxlcyAgCgpgYGB7Un0KcGhlbm9fZmVtYWxlX2RmIDwtIHBoZW5vX2RmICU+JSBmaWx0ZXIoc2V4ID09ICJGIikKcGhlbm9fZmVtYWxlX2RmJHN0YWdlMyA8LSBpZmVsc2UoCiAgcGhlbm9fZmVtYWxlX2RmJHN0YWdlICVpbiUgYygwLDEsMiksICIwLTIiLAogIGlmZWxzZShwaGVub19mZW1hbGVfZGYkc3RhZ2UgJWluJSBjKDMsNCksICIzLTQiLCAiNS02IikKKQpiZXRhUU5fQk1JUV9mZW1hbGUgPC0gYmV0YVFOX0JNSVFfZmVtYWxlWyAsIHBoZW5vX2ZlbWFsZV9kZiRzYW1wbGVdCgojIyMgdHJhbnNmb3JtIHRvIG0gdmFsdWVzCm12YWx1ZV9tYXQgPC0gbG9nMihiZXRhUU5fQk1JUV9mZW1hbGUgLyAoMSAtIGJldGFRTl9CTUlRX2ZlbWFsZSkpICNkaW06IDQ1NzQwMiAzMAoKIyMjIG9yZGVyIG1hdHJpeCBieSBtb3N0IHZhcmlhYmxlIHByb2JlcyBvbiB0b3AKYmV0YU9yZF9tYXQgPC0gT3JkZXJEYXRhQnlTZChiZXRhUU5fQk1JUV9mZW1hbGUpICNkaW06IDQ1NzQwMiAzMAptT3JkX21hdCA8LSBPcmRlckRhdGFCeVNkKG12YWx1ZV9tYXQpICAjZGltOiA0NTc0MDIgMzAKCmlkZW50aWNhbChwaGVub19mZW1hbGVfZGYkc2FtcGxlLCBjb2xuYW1lcyhiZXRhT3JkX21hdCkpCmlkZW50aWNhbChwaGVub19mZW1hbGVfZGYkc2FtcGxlLCBjb2xuYW1lcyhtT3JkX21hdCkpCgpwY2EgPC0gcHJjb21wKHQoYmV0YU9yZF9tYXRbMTo1MDAwMCwgXSksCiAgICAgICAgICAgICAgY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICBzY2FsZSA9IFRSVUUpCgpkIDwtIGRhdGEuZnJhbWUoUEMxID0gcGNhJHhbLCAxXSwgUEMyID0gcGNhJHhbLCAyXSkKCm1lYW5QQzEgPC0gbWVhbiAoZCRQQzEpCnNkUEMxICAgPC0gc2QgKGQkUEMxKQoKbWVhblBDMiA8LSBtZWFuIChkJFBDMikKc2RQQzIgICA8LSBzZCAoZCRQQzIpCgpvdXQzc2RQQzFfMSA8LSBtZWFuUEMxIC0gMyAqIHNkUEMxCm91dDNzZFBDMV8yIDwtIG1lYW5QQzEgKyAzICogc2RQQzEKCm91dDNzZFBDMl8xIDwtIG1lYW5QQzIgLSAzICogc2RQQzIKb3V0M3NkUEMyXzIgPC0gbWVhblBDMiArIDMgKiBzZFBDMgoKZCRvdXRsaWVyX1BDMVtkJFBDMSA+PSBvdXQzc2RQQzFfMSAmIGQkUEMxIDw9IG91dDNzZFBDMV8yXSA8LSAwCmQkb3V0bGllcl9QQzFbZCRQQzEgPCBvdXQzc2RQQzFfMSB8IGQkUEMxID4gb3V0M3NkUEMxXzJdIDwtIDEKCmQkb3V0bGllcl9QQzJbZCRQQzIgPj0gb3V0M3NkUEMyXzEgJiBkJFBDMiA8PSBvdXQzc2RQQzJfMl0gPC0gMApkJG91dGxpZXJfUEMyW2QkUEMyIDwgb3V0M3NkUEMyXzEgfCBkJFBDMiA+IG91dDNzZFBDMl8yXSA8LSAxCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpyZWFkcjo6d3JpdGVfY3N2KGQsIHBhc3RlMChkYXRhLmRpci5wY2EsICIvR0FTUEFST05JX1BDc191c2luZ0JldGFzX2ZlbWFsZS5jc3YiKSkKYGBgCgpgYGB7UiwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CiMjIyAyLlBDQSBwbG90CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQpgYGAKCmBgYHtSLCBldmFsID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9CiMjIyBCZWF0YSB2YWx1ZXMKYnlTdGFnZSA8LSBwbG90UENBKAogIGRhdGFzZXQgPSAiR2FzcGFyb25pOiBiZXRhIHZhbHVlcyIsCiAgZXhwU29ydGVkX21hdCA9IGJldGFPcmRfbWF0LAogIHBoZW5vID0gcGhlbm9fZmVtYWxlX2RmLAogIGdyb3VwX2NoYXIgPSAic3RhZ2UzIiwKICBudG9wID0gNTAwMDAsCiAgY2VudGVyID0gVFJVRSwKICBzY2FsZSA9IFRSVUUKKQoKIyMjIE0gdmFsdWVzCmJ5U3RhZ2UgPC0gcGxvdFBDQSgKICBkYXRhc2V0ID0gIkdhc3Bhcm9uaTogTSB2YWx1ZXMiLAogIGV4cFNvcnRlZF9tYXQgPSBtT3JkX21hdCwKICBwaGVubyA9IHBoZW5vX2ZlbWFsZV9kZiwKICBncm91cF9jaGFyID0gInN0YWdlMyIsCiAgbnRvcCA9IDUwMDAwLAogIGNlbnRlciA9IFRSVUUsCiAgc2NhbGUgPSBUUlVFCikKYGBgCgpgYGB7Un0KIyMjIEZpbHRlciBzYW1wbGVzIGJ5IFBDQQpub091dGxpZXJzIDwtIGRbd2hpY2goZCRvdXRsaWVyX1BDMSA9PSAwICYgZCRvdXRsaWVyX1BDMiA9PSAwKSwgXQpiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX2ZlbWFsZSA8LSBiZXRhUU5fQk1JUV9mZW1hbGVbLCByb3duYW1lcyhub091dGxpZXJzKV0gI2RpbTogNDU3NDAyIDI5CnBoZW5vX2ZlbWFsZV9kZiA8LSBwaGVub19mZW1hbGVfZGZbcGhlbm9fZmVtYWxlX2RmJHNhbXBsZSAlaW4lIHJvd25hbWVzKG5vT3V0bGllcnMpLF0gI2RpbTogMjkgNwpgYGAKCiMjIGZvciBtYWxlcyAgCgpgYGB7Un0KcGhlbm9fbWFsZV9kZiA8LSBwaGVub19kZiAlPiUgZmlsdGVyKHNleCA9PSAiTSIpCnBoZW5vX21hbGVfZGYkc3RhZ2UzIDwtIGlmZWxzZSgKICBwaGVub19tYWxlX2RmJHN0YWdlICVpbiUgYygwLDEsMiksICIwLTIiLAogIGlmZWxzZShwaGVub19tYWxlX2RmJHN0YWdlICVpbiUgYygzLDQpLCAiMy00IiwgIjUtNiIpCikKYmV0YVFOX0JNSVFfbWFsZSA8LSBiZXRhUU5fQk1JUV9tYWxlWyAsIHBoZW5vX21hbGVfZGYkc2FtcGxlXQoKIyMjIHRyYW5zZm9ybSB0byBtIHZhbHVlcwptdmFsdWVfbWF0IDwtIGxvZzIoYmV0YVFOX0JNSVFfbWFsZSAvICgxIC0gYmV0YVFOX0JNSVFfbWFsZSkpICNkaW06IDQ1NzQ2NCAyNwoKIyMjIG9yZGVyIG1hdHJpeCBieSBtb3N0IHZhcmlhYmxlIHByb2JlcyBvbiB0b3AKYmV0YU9yZF9tYXQgPC0gT3JkZXJEYXRhQnlTZChiZXRhUU5fQk1JUV9tYWxlKSAjZGltOiA0NTc0NjQgMjcKbU9yZF9tYXQgPC0gT3JkZXJEYXRhQnlTZChtdmFsdWVfbWF0KSAgI2RpbTogNDU3NDY0IDI3CgppZGVudGljYWwocGhlbm9fbWFsZV9kZiRzYW1wbGUsIGNvbG5hbWVzKGJldGFPcmRfbWF0KSkKaWRlbnRpY2FsKHBoZW5vX21hbGVfZGYkc2FtcGxlLCBjb2xuYW1lcyhtT3JkX21hdCkpCgpwY2EgPC0gcHJjb21wKHQoYmV0YU9yZF9tYXRbMTo1MDAwMCwgXSksCiAgICAgICAgICAgICAgY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICBzY2FsZSA9IFRSVUUpCgpkIDwtIGRhdGEuZnJhbWUoUEMxID0gcGNhJHhbLCAxXSwgUEMyID0gcGNhJHhbLCAyXSkKCm1lYW5QQzEgPC0gbWVhbiAoZCRQQzEpCnNkUEMxICAgPC0gc2QgKGQkUEMxKQoKbWVhblBDMiA8LSBtZWFuIChkJFBDMikKc2RQQzIgICA8LSBzZCAoZCRQQzIpCgpvdXQzc2RQQzFfMSA8LSBtZWFuUEMxIC0gMyAqIHNkUEMxCm91dDNzZFBDMV8yIDwtIG1lYW5QQzEgKyAzICogc2RQQzEKCm91dDNzZFBDMl8xIDwtIG1lYW5QQzIgLSAzICogc2RQQzIKb3V0M3NkUEMyXzIgPC0gbWVhblBDMiArIDMgKiBzZFBDMgoKZCRvdXRsaWVyX1BDMVtkJFBDMSA+PSBvdXQzc2RQQzFfMSAmIGQkUEMxIDw9IG91dDNzZFBDMV8yXSA8LSAwCmQkb3V0bGllcl9QQzFbZCRQQzEgPCBvdXQzc2RQQzFfMSB8IGQkUEMxID4gb3V0M3NkUEMxXzJdIDwtIDEKCmQkb3V0bGllcl9QQzJbZCRQQzIgPj0gb3V0M3NkUEMyXzEgJiBkJFBDMiA8PSBvdXQzc2RQQzJfMl0gPC0gMApkJG91dGxpZXJfUEMyW2QkUEMyIDwgb3V0M3NkUEMyXzEgfCBkJFBDMiA+IG91dDNzZFBDMl8yXSA8LSAxCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpyZWFkcjo6d3JpdGVfY3N2KGQsIHBhc3RlMChkYXRhLmRpci5wY2EsICIvR0FTUEFST05JX1BDc191c2luZ0JldGFzX21hbGUuY3N2IikpCmBgYAoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQojIyMgMi5QQ0EgcGxvdApsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKYGBgCgpgYGB7UiwgZXZhbCA9IFRSVUUsIGluY2x1ZGUgPSBUUlVFfQojIyMgQmVhdGEgdmFsdWVzCmJ5U3RhZ2UgPC0gcGxvdFBDQSgKICBkYXRhc2V0ID0gIkdhc3Bhcm9uaTogYmV0YSB2YWx1ZXMiLAogIGV4cFNvcnRlZF9tYXQgPSBiZXRhT3JkX21hdCwKICBwaGVubyA9IHBoZW5vX21hbGVfZGYsCiAgZ3JvdXBfY2hhciA9ICJzdGFnZTMiLAogIG50b3AgPSA1MDAwMCwKICBjZW50ZXIgPSBUUlVFLAogIHNjYWxlID0gVFJVRQopCgojIyMgTSB2YWx1ZXMKYnlTdGFnZSA8LSBwbG90UENBKAogIGRhdGFzZXQgPSAiR2FzcGFyb25pOiBNIHZhbHVlcyIsCiAgZXhwU29ydGVkX21hdCA9IG1PcmRfbWF0LAogIHBoZW5vID0gcGhlbm9fbWFsZV9kZiwKICBncm91cF9jaGFyID0gInN0YWdlMyIsCiAgbnRvcCA9IDUwMDAwLAogIGNlbnRlciA9IFRSVUUsCiAgc2NhbGUgPSBUUlVFCikKYGBgCgoKYGBge1J9CiMjIyBGaWx0ZXIgc2FtcGxlcyBieSBQQ0EKbm9PdXRsaWVycyA8LSBkW3doaWNoKGQkb3V0bGllcl9QQzEgPT0gMCAmIGQkb3V0bGllcl9QQzIgPT0gMCksIF0KYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlIDwtIGJldGFRTl9CTUlRX21hbGVbLCByb3duYW1lcyhub091dGxpZXJzKV0gI2RpbTogNDU3NDY0IDI3CnBoZW5vX21hbGVfZGYgPC0gcGhlbm9fbWFsZV9kZltwaGVub19tYWxlX2RmJHNhbXBsZSAlaW4lIHJvd25hbWVzKG5vT3V0bGllcnMpLF0gI2RpbTogMjcgNwpgYGAKCiMjIHNhdmUgZmlsZXMKCmBgYHtSfQpuYi5zYW1wbGVzLnBjYSA8LSBuY29sKGJldGFRTl9CTUlRX1BDZmlsdGVyZWRfZmVtYWxlKSArIG5jb2woYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlKQpuYi5mZW1hbGUuc2FtcGxlcy5wY2EgPC0gbmNvbChiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX2ZlbWFsZSkKbmIubWFsZS5zYW1wbGVzLnBjYSA8LSBuY29sKGJldGFRTl9CTUlRX1BDZmlsdGVyZWRfbWFsZSkKZGltKGJldGFRTl9CTUlRX1BDZmlsdGVyZWRfZmVtYWxlKQpkaW0oYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlKQpkaW0ocGhlbm9fZmVtYWxlX2RmKQpkaW0ocGhlbm9fbWFsZV9kZikKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CnNhdmUoCiAgYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9mZW1hbGUsCiAgYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlLAogIG5iLnNhbXBsZXMucGNhLAogIG5iLmZlbWFsZS5zYW1wbGVzLnBjYSwKICBuYi5tYWxlLnNhbXBsZXMucGNhLAogIHBoZW5vX2ZlbWFsZV9kZiwKICBwaGVub19tYWxlX2RmLAogIGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL0dBU1BBUk9OSV9RTkJNSVFfUENmaWx0ZXJlZC5yZGEiKQopCmBgYAoKIyBTdW1tYXJ5IGFmdGVyIFFDIHN0ZXBzCgojIyBEYXRhIGFuZCBtZXRhZGF0YQoKYGBge1IsIHdhcm5pbmc9VFJVRSwgc2hvdyA9IEZBTFNFfQpwaGVub19mZW1hbGVfZGYgJT4lIAogIERUOjpkYXRhdGFibGUoZmlsdGVyID0gJ3RvcCcsCiAgICAgICAgICAgICAgICBzdHlsZSA9ICJib290c3RyYXAiLAogICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9ICdCZnJ0aXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IEkoJ2NvbHZpcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDEwKSwgCiAgICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJGZW1hbGUgc2FtcGxlcyBtZXRhZGF0YSIpCgpwaGVub19tYWxlX2RmICU+JSAKICBEVDo6ZGF0YXRhYmxlKGZpbHRlciA9ICd0b3AnLAogICAgICAgICAgICAgICAgc3R5bGUgPSAiYm9vdHN0cmFwIiwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChzY3JvbGxYID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSAnQmZydGlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBJKCdjb2x2aXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCksIAogICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiTWFsZSBzYW1wbGVzIG1ldGFkYXRhIikKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CmdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX2ZlbWFsZV9kZiwgeCA9ICJzdGFnZSIsYmlucyA9IDgpCiMgZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fZmVtYWxlX2RmLCB4ID0gInN0YWdlIixiaW5zID0gOCxmYWNldC5ieSA9ICJzZXgiLGZpbGwgPSAic2V4IikKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fZmVtYWxlX2RmLCB4ID0gImFnZS5icmFpbiIsYmlucyA9IDIwKQojIGdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX2ZlbWFsZV9kZiwgeCA9ICJhZ2UuYnJhaW4iLGJpbnMgPSAyMCxmaWxsID0gInNleCIsZmFjZXQuYnkgPSAic2V4IikKCmdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX21hbGVfZGYsIHggPSAic3RhZ2UiLGJpbnMgPSA4KQojIGdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX21hbGVfZGYsIHggPSAic3RhZ2UiLGJpbnMgPSA4LGZhY2V0LmJ5ID0gInNleCIsZmlsbCA9ICJzZXgiKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKGRhdGEgPSBwaGVub19tYWxlX2RmLCB4ID0gImFnZS5icmFpbiIsYmlucyA9IDIwKQojIGdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX21hbGVfZGYsIHggPSAiYWdlLmJyYWluIixiaW5zID0gMjAsZmlsbCA9ICJzZXgiLGZhY2V0LmJ5ID0gInNleCIpCmBgYAoKCiMjIE51bWJlcnMgb2Ygc2FtcGxlcyBhbmQgcHJvYmVzIHJlbW92ZWQgaW4gZWFjaCBzdGVwCgpgYGB7UiwgZWNobyA9IEZBTFNFfQpkZi5zYW1wbGVzIDwtIGRhdGEuZnJhbWUoCiAgIk51bWJlciBvZiBzYW1wbGVzIiA9ICBjKG5iLnNhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLndpdGguY2xpbmljYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLnBjYSksCiAgIkRlc2NyaXB0aW9uIiA9IGMoInRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiwKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyB3aXRoIGJpc3VsZmF0ZSBjb252ZXJzaW9uID4gODgiLAogICAgICAgICAgICAgICAgICAgICJzYW1wbGVzIHdpdGggY2xpbmljYWwgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMgYWZ0ZXIgUENBIiksCiAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkIC0gbmIuc2FtcGxlcywKICAgICAgICAgICAgICAgICAgIG5iLnNhbXBsZXMud2l0aC5jbGluaWNhbCAtIG5iLnNhbXBsZXMuYmMuZmlsdGVyZWQsCiAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLnBjYSAtIG5iLnNhbXBsZXMud2l0aC5jbGluaWNhbCkKKSAgICAKZGYuc2FtcGxlcyAgICAgICAgICAgCgoKZGYuZmVtYWxlLnNhbXBsZXMgPC0gZGF0YS5mcmFtZSgKICAiTnVtYmVyIG9mIHNhbXBsZXMiID0gIGMobmIuZmVtYWxlLnNhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5mZW1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuZmVtYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLnBjYSksCiAgIkRlc2NyaXB0aW9uIiA9IGMoIkZlbWFsZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyIsCiAgICAgICAgICAgICAgICAgICAgIkZlbWFsZSBzYW1wbGVzIHdpdGggYmlzdWxmYXRlIGNvbnZlcnNpb24gPiA4OCIsCiAgICAgICAgICAgICAgICAgICAgIkZlbWFsZSBzYW1wbGVzIHdpdGggY2xpbmljYWwgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgIkZlbWFsZSBzYW1wbGVzIGFmdGVyIFBDQSIpLAogICJEaWZmZXJlbmNlIiA9IGMoIi0iLAogICAgICAgICAgICAgICAgICAgbmIuZmVtYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgLSBuYi5mZW1hbGUuc2FtcGxlcywKICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwgLSBuYi5mZW1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLnBjYSAtIG5iLmZlbWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwpCikgICAgCmRmLmZlbWFsZS5zYW1wbGVzICAgICAgICAgICAKCgpkZi5tYWxlLnNhbXBsZXMgPC0gZGF0YS5mcmFtZSgKICAiTnVtYmVyIG9mIHNhbXBsZXMiID0gIGMobmIubWFsZS5zYW1wbGVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIubWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5tYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLm1hbGUuc2FtcGxlcy5wY2EpLAogICJEZXNjcmlwdGlvbiIgPSBjKCJNYWxlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiwKICAgICAgICAgICAgICAgICAgICAiTWFsZSBzYW1wbGVzIHdpdGggYmlzdWxmYXRlIGNvbnZlcnNpb24gPiA4OCIsCiAgICAgICAgICAgICAgICAgICAgIk1hbGUgc2FtcGxlcyB3aXRoIGNsaW5pY2FsIGRhdGEiLAogICAgICAgICAgICAgICAgICAgICJNYWxlIHNhbXBsZXMgYWZ0ZXIgUENBIiksCiAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICBuYi5tYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgLSBuYi5tYWxlLnNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICBuYi5tYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCAtIG5iLm1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICAgICAgICAgICAgICAgIG5iLm1hbGUuc2FtcGxlcy5wY2EgLSBuYi5tYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCkKKSAgICAKZGYubWFsZS5zYW1wbGVzICAgICAgICAgICAKCiMgQ3JlYXRlIHN1bW1hcnkgdGFibGUKZGYucHJvYmVzIDwtIGRhdGEuZnJhbWUoIk51bWJlciBvZiBwcm9iZXMiID0gYyhuYi5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmRldGVjdFAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5kZXRlY3RQLmNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5jZy5kbXJjYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5kbXJjYXRlLmNock0pLAogICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24iID0gYygidG90YWwgbnVtYmVyIG9mIHByb2JlcyBpbiByYXcgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3Rpb24gUCA8IDAuMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBwcm9iZXMgdGhhdCBzdGFydCB3aXRoIGNnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRNUmNhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRlIHByb2JlcyBvbiBjaHJNIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbmNlIiA9IGMoIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5kZXRlY3RQIC0gbmIucHJvYmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5kZXRlY3RQLmNnIC0gbmIucHJvYmVzLmRldGVjdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmNnLmRtcmNhdGUgLSBuYi5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5wcm9iZXMuZG1yY2F0ZS5jaHJNIC0gbmIucHJvYmVzLmNnLmRtcmNhdGUpCikKZGYucHJvYmVzCgpkZi5jaHJBdXRvLnByb2JlcyA8LSBkYXRhLmZyYW1lKCJOdW1iZXIgb2YgcHJvYmVzIiA9IGMobmIuY2hyQXV0by5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJBdXRvLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNockF1dG8ucHJvYmVzLmNnLmRtcmNhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24iID0gYygiYXV0b3NvbWUgdG90YWwgbnVtYmVyIG9mIHByb2JlcyBpbiByYXcgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRvc29tZSBkZXRlY3Rpb24gUCA8IDAuMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0b3NvbWUgb25seSBwcm9iZXMgdGhhdCBzdGFydCB3aXRoIGNnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1dG9zb21lIERNUmNhdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UCAtIG5iLmNockF1dG8ucHJvYmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNockF1dG8ucHJvYmVzLmRldGVjdFAuY2cgLSBuYi5jaHJBdXRvLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNockF1dG8ucHJvYmVzLmNnLmRtcmNhdGUgLSBuYi5jaHJBdXRvLnByb2Jlcy5kZXRlY3RQLmNnKQopCmRmLmNockF1dG8ucHJvYmVzCgpkZi5jaHJYLnByb2JlcyA8LSBkYXRhLmZyYW1lKCJOdW1iZXIgb2YgcHJvYmVzIiA9IGMobmIuY2hyWC5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclgucHJvYmVzLmNnLmRtcmNhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24iID0gYygiY2hyb21vc29tZSBYIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgaW4gcmF3IGRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hyb21vc29tZSBYIGRldGVjdGlvbiBQIDwgMC4wMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lIFggb25seSBwcm9iZXMgdGhhdCBzdGFydCB3aXRoIGNnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNocm9tb3NvbWUgWCBETVJjYXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbmNlIiA9IGMoIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclgucHJvYmVzLmRldGVjdFAgLSBuYi5jaHJYLnByb2JlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnIC0gbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJYLnByb2Jlcy5jZy5kbXJjYXRlIC0gbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UC5jZykKKQpkZi5jaHJYLnByb2JlcwoKZGYuY2hyWS5wcm9iZXMgPC0gZGF0YS5mcmFtZSgiTnVtYmVyIG9mIHByb2JlcyIgPSBjKG5iLmNoclkucHJvYmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuZGV0ZWN0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclkucHJvYmVzLmRldGVjdFAuY2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJZLnByb2Jlcy5jZy5kbXJjYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0aW9uIiA9IGMoImNocm9tb3NvbWUgWSB0b3RhbCBudW1iZXIgb2YgcHJvYmVzIGluIHJhdyBkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNocm9tb3NvbWUgWSBkZXRlY3Rpb24gUCA8IDAuMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hyb21vc29tZSBZIG9ubHkgcHJvYmVzIHRoYXQgc3RhcnQgd2l0aCBjZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lIFkgRE1SY2F0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGlmZmVyZW5jZSIgPSBjKCItIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJZLnByb2Jlcy5kZXRlY3RQIC0gbmIuY2hyWS5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuZGV0ZWN0UC5jZyAtIG5iLmNoclkucHJvYmVzLmRldGVjdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuY2cuZG1yY2F0ZSAtIG5iLmNoclkucHJvYmVzLmRldGVjdFAuY2cpCikKZGYuY2hyWS5wcm9iZXMKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CnNhdmUoZGYuc2FtcGxlcyxkZi5wcm9iZXMsZmlsZSA9IGZpbGUucGF0aChkYXRhLmRpci50YWJsZSwgIi9HQVNQQVJPTklfdGFibGUucmRhIikpCmBgYAoKPCEtLSAjIENvbXB1dGUgbmV1cm9uIHByb3BvcnRpb24gLS0+Cgo8IS0tIERhdGEgZnJvbSAgaHR0cHM6Ly93d3cudGFuZGZvbmxpbmUuY29tL2RvaS9mdWxsLzEwLjQxNjEvZXBpLjIzOTI0IC0tPgoKPCEtLSAtIElucHV0OiBHYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWQuUkRTLCBwaGVub19kZi5SRFMgLS0+Cgo8IS0tIC0gT3V0cHV0OiBwaGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMgLS0+Cgo8IS0tIGBgYHtSfSAtLT4KPCEtLSBvYmplY3RzIDwtIGxvYWQoIi4uLy4uL0NFVC9DRVRTX0ltYWdlLlJEYXRhIikgLS0+CjwhLS0gb2JqZWN0cyAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMjIEdldCByZWZlcmVuY2UgcHJvZmlsZSBmcm9tIENhdWNhc2lvbnMgKyBjb250cm9scyAgLS0+CjwhLS0gYGBge1J9IC0tPgo8IS0tIGlkeCA8LSBsaXN0KCAtLT4KPCEtLSAgIGNvbnRyb2xOZXVyb24gPSBwZEJyYWluJGNlbGx0eXBlID09ICJOIiAmIHBkQnJhaW4kZGlhZyA9PSAiQ29udHJvbCIgJiBwZEJyYWluJGV0aG5pY2l0eSA9PSAiQ2F1Y2FzaWFuIiwgLS0+CjwhLS0gICBjb250cm9sR2xpYSAgID0gcGRCcmFpbiRjZWxsdHlwZSA9PSAiRyIgJiBwZEJyYWluJGRpYWcgPT0gIkNvbnRyb2wiICYgcGRCcmFpbiRldGhuaWNpdHkgPT0gIkNhdWNhc2lhbiIgLS0+CjwhLS0gKSAtLT4KCjwhLS0gcmVmUHJvZmlsZSA8LSBnZXRSZWZlcmVuY2UoYnJhaW4sIGlkeCkgLS0+CgoKPCEtLSAjIyMjIyAyLiBFc3RpbWF0ZSBwcm9wb3J0aW9ucyBvZiBuZXVyb25zIGluIFBGQyBzYW1wbGVzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KCjwhLS0gIyMjIExpbWl0IHRvIDEwLDAwMCBjcGdzIGluIHRoZSByZWZQcm9maWxlIGRhdGFzZXQgLS0+CjwhLS0gcGZjIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLnBjYSwgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWQuUkRTIikpICNkaW06IDQzMzY1NiA1OSAtLT4KCjwhLS0gc2VsZWN0ZWQgPC0gcm93bmFtZXMocGZjKSAlaW4lIHJvd25hbWVzKHJlZlByb2ZpbGUpIC0tPgoKPCEtLSBwZmMucmVmY3BncyA8LSBwZmNbc2VsZWN0ZWQsIF0gIC0tPgoKPCEtLSAjIyMgRXN0aW1hdGUgcHJvcG9ydGlvbiBvZiBuZXVyb25zIC0tPgo8IS0tIHByb3AgPC0gZGF0YS5mcmFtZShlc3RQcm9wb3J0aW9uKHBmYy5yZWZjcGdzLCBwcm9maWxlID0gcmVmUHJvZmlsZSkpIC0tPgo8IS0tIGNvbG5hbWVzKHByb3ApIDwtICJwcm9wLm5ldXJvbiIgLS0+Cgo8IS0tICMjIyMjIDMuIE1lcmdlIHBmYy5yZWZjcGdzIHdpdGggcGhlbm90eXBlIGZpbGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tIHBoZW5vIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLnBjYSwgIi9waGVub19kZi5SRFMiKSkgLS0+Cgo8IS0tIHBoZW5vX2ZpbmFsIDwtIG1lcmdlKCAtLT4KPCEtLSAgIHBoZW5vLCAtLT4KPCEtLSAgIHByb3AsIC0tPgo8IS0tICAgYnkueCA9ICJzYW1wbGUiLCAtLT4KPCEtLSAgIGJ5LnkgPSAicm93Lm5hbWVzIiAtLT4KPCEtLSApIC0tPgoKPCEtLSBzYXZlUkRTKHBoZW5vX2ZpbmFsLCBwYXN0ZTAoZGF0YS5kaXIubmV1cm9uLCAiL3BoZW5vX3dpdGhOZXVyb25Qcm9wX2RmLlJEUyIpKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMgTGluZWFyIHJlZ3Jlc3Npb24gYnkgY3BncyBNZXRoeWxhdGlvbiAgLS0+Cgo8IS0tIElucHV0OiAgLS0+Cgo8IS0tIC0gR2FzcGFyb25pX1FOQk1JUV9QQ2ZpbHRlcmVkLlJEUywgLS0+CjwhLS0gLSBwaGVubzU5X3dpdGhOZXVyb25Qcm9wX2RmLlJEUyAtLT4KCjwhLS0gT3V0cHV0OiAtLT4KCjwhLS0gLSBHYXNwYXJvbmlfc2luZ2xlX2NwZ19wVmFsX2RmLmNzdiAtLT4KCjwhLS0gIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgoKPCEtLSBgYGB7Un0gLS0+CjwhLS0gYmV0YV9tYXQgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL0dhc3Bhcm9uaV9RTkJNSVFfUENmaWx0ZXJlZC5SRFMiKSkgIC0tPgo8IS0tIHBoZW5vX2RmIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLm5ldXJvbiwgIi9waGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMiKSkgIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMgVGVzdCBhbGwgY3BncyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBUUlVFfSAtLT4KPCEtLSAjIyMgQ29tcHV0ZSBNIHZhbHVlcyAtLT4KPCEtLSBtdmFsX21hdCA8LSBsb2cyKGJldGFfbWF0IC8gKDEgLSBiZXRhX21hdCkpIC0tPgoKPCEtLSBwaGVub19kZiRTYW1wbGUgPC0gcGhlbm9fZGYkc2FtcGxlIC0tPgoKPCEtLSBpZGVudGljYWwocGhlbm9fZGYkU2FtcGxlLCBjb2xuYW1lcyhtdmFsX21hdCkpIC0tPgoKPCEtLSBwaGVub19kZiRzZXggPC0gYXMuZmFjdG9yKHBoZW5vX2RmJHNleCkgLS0+CjwhLS0gcGhlbm9fZGYkc2xpZGUgPC0gYXMuZmFjdG9yKHBoZW5vX2RmJHNsaWRlKSAtLT4KPCEtLSAjIElmIHJvc21hcCBjb2hvcnQsIGRvbid0IGZvcmdldCBiYXRjaCBlZmZlY3QgLS0+Cgo8IS0tIHN0cihwaGVub19kZikgLS0+Cgo8IS0tIGlzKHBoZW5vX2RmJHN0YWdlLCJudW1lcmljIikgLS0+CjwhLS0gaXMocGhlbm9fZGYkYWdlLmJyYWluLCJudW1lcmljIikgLS0+CjwhLS0gaXMocGhlbm9fZGYkcHJvcC5uZXVyb24sIm51bWVyaWMiKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7UiwgZXZhbCA9IEZBTFNFfSAtLT4KPCEtLSBwcmVkaWN0b3JzX2NoYXIgPC0gInN0YWdlIiAtLT4KPCEtLSBjb3ZhcmlhdGVzX2NoYXIgPC0gYygiYWdlLmJyYWluIiwgInNleCIsICJwcm9wLm5ldXJvbiIsICJzbGlkZSIpIC0tPgoKCjwhLS0gZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkvMikgLS0+CjwhLS0gZGV2dG9vbHM6OnNvdXJjZV9naXN0KCJodHRwczovL2dpc3QuZ2l0aHViLmNvbS90aWFnb2Noc3QvZDNhN2IxNjM5YWNmNjAzOTE2YzMxNWQyM2IxZWZiM2UiKSAtLT4KCjwhLS0gcmVzdWx0c19vcmRlcmVkX2RmIDwtIHBseXI6OmFkcGx5KG12YWxfbWF0LDEsIGZ1bmN0aW9uKHJvdyl7IC0tPgoKPCEtLSAgIHN1bU9uZVJlZ2lvbl9kZiA8LSBkYXRhLmZyYW1lKHQocm93KSkgLS0+Cgo8IS0tICAgcmVzdWx0IDwtIFRlc3RTaW5nbGVSZWdpb24oIC0tPgo8IS0tICAgICBwcmVkaWN0b3JzX2NoYXIgPSBwcmVkaWN0b3JzX2NoYXIsIC0tPgo8IS0tICAgICBjb3ZhcmlhdGVzX2NoYXIgPSBjb3ZhcmlhdGVzX2NoYXIsIC0tPgo8IS0tICAgICBwaGVub19kZiA9IHBoZW5vX2RmLCAtLT4KPCEtLSAgICAgc3VtT25lUmVnaW9uX2RmID0gc3VtT25lUmVnaW9uX2RmIC0tPgo8IS0tICAgKSAtLT4KPCEtLSAgIHJlc3VsdCAtLT4KPCEtLSB9LCAucHJvZ3Jlc3MgPSAidGltZSIsLnBhcmFsbGVsID0gVFJVRSwuaWQgPSAiY3BnIikgLS0+CjwhLS0gY29sbmFtZXMocmVzdWx0c19vcmRlcmVkX2RmKVsxXSA8LSAiY3BnIiAtLT4KCjwhLS0gaWRlbnRpY2FsKHJvdy5uYW1lcyhtdmFsX21hdCksIHJlc3VsdHNfb3JkZXJlZF9kZiRjcGcgJT4lIGFzLmNoYXJhY3RlcigpKSAtLT4KCjwhLS0gcmVzdWx0c19vcmRlcmVkX2RmJGZkciA8LSBwLmFkanVzdCggLS0+CjwhLS0gICAgIHJlc3VsdHNfb3JkZXJlZF9kZiRwVmFsdWUsIC0tPgo8IS0tICAgICBtZXRob2QgPSAiZmRyIiAtLT4KPCEtLSApIC0tPgoKPCEtLSB3cml0ZS5jc3YoIC0tPgo8IS0tICAgcmVzdWx0c19vcmRlcmVkX2RmLCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5zaW5nbGUuY3BnLnB2YWwsICIvR2FzcGFyb25pX3NpbmdsZV9jcGdfcFZhbF9kZi5jc3YiKSwgLS0+CjwhLS0gICByb3cubmFtZXMgPSBGQUxTRSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIHJlc3VsdHNfb3JkZXJlZF9kZiA8LSByZWFkcjo6cmVhZF9jc3YoIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnNpbmdsZS5jcGcucHZhbCwgIi9HYXNwYXJvbmlfc2luZ2xlX2NwZ19wVmFsX2RmLmNzdiIpLCAtLT4KPCEtLSAgIGNvbF90eXBlcyA9IHJlYWRyOjpjb2xzKCkpIC0tPgo8IS0tIHJlc3VsdHNfb3JkZXJlZF9kZiAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSAjIExpbmVhciByZWdyZXNzaW9uIGJ5IHJlZ2lvbnMgbWVkaWFuIE1ldGh5bGF0aW9uICAtLT4KCjwhLS0gIyMgUmVzaWR1YWxzIGNvbnRyb2wgYW5kIGNvTWV0aHlsYXRlZCBSZWdpb25zIC0tPgoKPCEtLSAxLiBUYWtlIHJlc2lkdWFscyAtLT4KPCEtLSAyLiBGaW5kIGNvLW1ldGh5bGF0ZWQgcmVnaW9ucyAtLT4KCjwhLS0gSW5wdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZCAtLT4KPCEtLSAtIHBoZW5vX3dpdGhOZXVyb25Qcm9wX2RmIC0tPgoKPCEtLSBPdXRwdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZF9tdmFsUmVzaWR1YWxzIC0tPgo8IS0tIC0gcmVzaWR1YWxzX2NvbWV0aF9scyAtLT4KCjwhLS0gIyMjIFJlc2lkdWFscyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gIyMjIyMgMS4gSW1wb3J0IGRhdGFzZXRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gYmV0YV9tYXQgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL0dhc3Bhcm9uaV9RTkJNSVFfUENmaWx0ZXJlZC5SRFMiKSkgI2RpbTo0MzM2NTYgNTkgLS0+CjwhLS0gcGhlbm9fZGYgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIubmV1cm9uLCAiL3BoZW5vX3dpdGhOZXVyb25Qcm9wX2RmLlJEUyIpKSAjZGltOjU5IDcgLS0+Cgo8IS0tICMjIyBDb21wdXRlIE0gdmFsdWVzIC0tPgo8IS0tIG12YWx1ZV9tYXQgPC0gbG9nMihiZXRhX21hdCAvICgxIC0gYmV0YV9tYXQpKSAtLT4KCjwhLS0gIyMjIFJlb3JkZXIgc2FtcGxlcyBiYXNlZCBvbiBwaGVub19kZiAtLT4KPCEtLSBtdmFsdWVfbWF0IDwtIG12YWx1ZV9tYXRbLCBwaGVub19kZiRzYW1wbGVdIC0tPgoKPCEtLSBpZGVudGljYWwoY29sbmFtZXMobXZhbHVlX21hdCksICBwaGVub19kZiRzYW1wbGUpIC0tPgoKPCEtLSAjIyMgVGFrZSByZXNpZHVhbHMgLS0+CjwhLS0gbG1GIDwtIGZ1bmN0aW9uKG12YWwpeyAtLT4KPCEtLSAgIGZpdEUgPC0gbG0oIC0tPgo8IS0tICAgICBhcy5udW1lcmljKG12YWwpIH4gYWdlLmJyYWluICsgc2V4ICsgcHJvcC5uZXVyb24gKyBhcy5jaGFyYWN0ZXIoc2xpZGUpLCAjYWRkIGJhdGNoIGlmIHJvc21hcCAtLT4KPCEtLSAgICAgZGF0YSA9IHBoZW5vX2RmLCAtLT4KPCEtLSAgICAgbmEuYWN0aW9uID0gbmEuZXhjbHVkZSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gICByZXNpZHVhbHMgKGZpdEUpIC0tPgo8IS0tIH0gLS0+CjwhLS0gZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gNCkgLS0+CjwhLS0gcmVzaWQgPC0gcGx5cjo6YWRwbHkobXZhbHVlX21hdCwxLC5mdW4gPSBsbUYsLnByb2dyZXNzID0gInRpbWUiLC5wYXJhbGxlbCA9IFRSVUUpIC0tPgo8IS0tIHJvd25hbWVzKHJlc2lkKSA8LSByZXNpZFssMV0gLS0+CjwhLS0gcmVzaWRbLDFdIDwtIE5VTEwgLS0+CjwhLS0gY29sbmFtZXMocmVzaWQpIDwtIGNvbG5hbWVzKG12YWx1ZV9tYXQpIC0tPgo8IS0tIGRpbShyZXNpZCkgLS0+CjwhLS0gZGltKG12YWx1ZV9tYXQpIC0tPgoKPCEtLSAjIyMgU2F2ZSBkYXRhc2V0IC0tPgo8IS0tIHNhdmVSRFMoIC0tPgo8IS0tICAgcmVzaWQsIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWRfbXZhbFJlc2lkdWFscy5SRFMiKSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMjIEZpbmQgY28tbWV0aHlsYXRlZCByZWdpb25zIC0tPgoKPCEtLSBgYGB7UiwgZXZhbCA9IEZBTFNFfSAtLT4KPCEtLSAjIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgo8IS0tIG12YWx1ZV9yZXNpZHVhbHNfbWF0IDwtIHJlYWRSRFMoIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWRfbXZhbFJlc2lkdWFscy5SRFMiKSAtLT4KPCEtLSApIC0tPgoKPCEtLSAjIyMgQ2FsbCBpbiBmdW5jdGlvbnMgLS0+CjwhLS0gbGlicmFyeShjb01ldGhETVIpIC0tPgo8IS0tIGxpYnJhcnkoQmlvY1BhcmFsbGVsKSAtLT4KCjwhLS0gcHJvYmVzLmNsdXN0ZXIuYWxsIDwtIGNvTWV0aERNUjo6Z2V0UHJlZGVmaW5lZENsdXN0ZXIoYXJyYXlUeXBlID0gIjQ1MGsiLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyVHlwZSA9ICJyZWdpb25zIikgLS0+Cgo8IS0tIG5jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKS8yIC0tPgo8IS0tICMjIyBGaW5kIGNvLW1ldGh5bGF0ZWQgY2x1c3RlcnMgLS0+CjwhLS0gY29NZXRoX2xzIDwtIENvTWV0aEFsbFJlZ2lvbnMoIC0tPgo8IS0tICAgZG5hbSA9IG12YWx1ZV9yZXNpZHVhbHNfbWF0LCAgICAgICAtLT4KPCEtLSAgIGJldGFUb00gPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgIC0tPgo8IS0tICAgQ3BHc19scyA9IHByb2Jlcy5jbHVzdGVyLmFsbCwgLS0+CjwhLS0gICBhcnJheVR5cGUgPSAiNDUwayIsIC0tPgo8IS0tICAgckRyb3BUaHJlc2hfbnVtID0gMC40LCAtLT4KPCEtLSAgIG1pblBhaXJ3aXNlQ29yciA9IE5VTEwsIC0tPgo8IS0tICAgbWV0aG9kID0gInNwZWFybWFuIiwgICAgICAgICAgICAgIC0tPgo8IS0tICAgcmV0dXJuQWxsQ3BHcyA9IFRSVUUsICAgICAgICAgICAgICAgLS0+CjwhLS0gICBvdXRwdXQgPSAiYWxsIiwgLS0+CjwhLS0gICBuQ29yZXNfaW50ID0gbmNvcmVzLCAtLT4KPCEtLSAgIHByb2dyZXNzYmFyID0gRkFMU0UgLS0+CjwhLS0gKSAtLT4KCjwhLS0gc2F2ZVJEUyggLS0+CjwhLS0gICBjb01ldGhfbHMsIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywiL0dhc3Bhcm9uaV9yZXNpZHVhbHNfY29tZXRoX2lucHV0X2xzLlJEUyIpIC0tPgo8IS0tICkgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAjIyBMaW5lYXIgcmVncmVzc2lvbiBieSByZWdpb25zIG1lZGlhbiBNZXRoeWxhdGlvbiAgLS0+Cgo8IS0tIDEuIENhbGN1bGF0ZSBtZWRpYW5zIGJ5IGNsdXN0ZXIgYW5kIHNhbXBsZSAtLT4KPCEtLSAyLiBsaW5lYXIgcmVncmVzc2lvbiAtLT4KCjwhLS0gSW5wdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZCwgLS0+CjwhLS0gLSBwaGVub193aXRoTmV1cm9uUHJvcF9kZiAtLT4KPCEtLSAtIHJlc2lkdWFsc19jb21ldGhfaW5wdXRfbHMgLS0+Cgo8IS0tIE91dHB1dDogIC0tPgoKPCEtLSAtIGluZm9fZGYgLS0+CjwhLS0gLSBtZWRpYW5zTXZhbF9kZiAtLT4KPCEtLSAtIGxpbmVhcl9kZl9hZ2luZyAtLT4KCjwhLS0gIyMjIENhbGN1bGF0ZSBtZWRpYW5zIGJ5IGNsdXN0ZXIgYW5kIHNhbXBsZSAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gIyMjIEltcG9ydCBkYXRhc2V0cyAtLT4KPCEtLSBiZXRhX21hdCA8LSByZWFkUkRTKHBhc3RlMChkYXRhLmRpci5wY2EsIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvR2FzcGFyb25pX1FOQk1JUV9QQ2ZpbHRlcmVkLlJEUyIpKSAtLT4KPCEtLSBwaGVub19kZiA8LSByZWFkUkRTKHBhc3RlMChkYXRhLmRpci5uZXVyb24sICIvcGhlbm9fd2l0aE5ldXJvblByb3BfZGYuUkRTIikpIC0tPgo8IS0tIG12YWxfbWF0IDwtIGxvZzIoYmV0YV9tYXQgLyAoMSAtIGJldGFfbWF0KSkgJT4lIGFzLm1hdHJpeCgpIC0tPgo8IS0tIGNvTWV0aF9scyA8LSByZWFkUkRTKCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5yZXNpZHVhbHMsICIvR2FzcGFyb25pX3Jlc2lkdWFsc19jb21ldGhfaW5wdXRfbHMuUkRTIikgLS0+CjwhLS0gKSAtLT4KCjwhLS0gIyMjIENyZWF0ZSBpbmZvIGRhdGFzZXQgLS0+CjwhLS0gaW5wdXRfY29tZXRoIDwtIGRhdGEuZnJhbWUoIC0tPgo8IS0tICAgaW5wdXRSZWdpb24gPSBjb01ldGhfbHMkaW5wdXRSZWdpb25fY2hyLCAtLT4KPCEtLSAgIG5Db01ldGhSZWdpb24gPSBjb01ldGhfbHMkbkNvTWV0aFJlZ2lvbnNfbnVtLCAtLT4KPCEtLSAgIGNvTWV0aFJlZ2lvbiA9IG5hbWVzKGNvTWV0aF9scyRjb01ldGhfbHMpLCAtLT4KPCEtLSAgIG5DcEdzID0gdW5saXN0KGxhcHBseShjb01ldGhfbHMkY29NZXRoX2xzLCBsZW5ndGgpLCB1c2UubmFtZXMgPSBGQUxTRSksIC0tPgo8IS0tICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFIC0tPgo8IS0tICkgLS0+Cgo8IS0tIGlucHV0X2NvbWV0aF9ub2R1cCA8LSBpbnB1dF9jb21ldGhbIC0tPgo8IS0tICAgIWR1cGxpY2F0ZWQoaW5wdXRfY29tZXRoJGNvTWV0aFJlZ2lvbiksIC0tPgo8IS0tICAgXSAtLT4KPCEtLSBjb2xuYW1lcyhpbnB1dF9jb21ldGhfbm9kdXApIDwtIGMoIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9pbnB1dFJlZ2lvbiIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfbkNvTWV0aFJlZ2lvbiIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfY29NZXRoUmVnaW9uIiksIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9uQ3BHcyIpIC0tPgo8IS0tICkgLS0+Cgo8IS0tIHNhdmVSRFMoIC0tPgo8IS0tICAgaW5wdXRfY29tZXRoX25vZHVwLCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5tZWRpYW4sIGNvaG9ydCwiX2luZm9fZGYucmRzIikgLS0+CjwhLS0gKSAtLT4KCjwhLS0gIyMjIFRha2UgbWVkaWFuIG9mIHByb2JlcyBpbiBlYWNoIGNsdXN0ZXIgZm9yIGVhY2ggc2FtcGxlIC0tPgo8IS0tIGZpbGVuYW1lIDwtICBwYXN0ZTAocGFzdGUwKGRhdGEuZGlyLm1lZGlhbiwgY29ob3J0LCAiX21lZGlhbnNNdmFsX2RmLnJkcyIpKSAtLT4KPCEtLSBsaWJyYXJ5KHJvYnVzdGJhc2UpIC0tPgo8IS0tIG12YWxfbWF0IDwtIG12YWxfbWF0W3Jvd25hbWVzKG12YWxfbWF0KSAlaW4lIHVubGlzdChjb01ldGhfbHMkY29NZXRoX2xzKSxdIC0tPgo8IS0tIGlmKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpeyAtLT4KPCEtLSAgIG1lZGlhbk12YWwuZGYgPC0gcGx5cjo6bGRwbHkoIC0tPgo8IS0tICAgICBjb01ldGhfbHMkY29NZXRoX2xzWyFkdXBsaWNhdGVkKG5hbWVzKGNvTWV0aF9scyRjb01ldGhfbHMpKV0sIC0tPgo8IS0tICAgICBmdW5jdGlvbihwcm9iZXMpeyAtLT4KPCEtLSAgICAgICBjb2xNZWRpYW5zKG12YWxfbWF0W2FzLmNoYXJhY3Rlcihwcm9iZXMpLF0sIG5hLnJtID0gVFJVRSkgLS0+CjwhLS0gICAgIH0sIC0tPgo8IS0tICAgICAucHJvZ3Jlc3MgPSAidGltZSIgLS0+CjwhLS0gICApIC0tPgo8IS0tICAgbWVkaWFuTXZhbC5kZiQuaWQgPC0gTlVMTCAtLT4KPCEtLSAgIGNvbG5hbWVzKG1lZGlhbk12YWwuZGYpIDwtIGNvbG5hbWVzKG12YWxfbWF0KSAtLT4KPCEtLSAgIHNhdmVSRFMobWVkaWFuTXZhbC5kZiwgZmlsZSA9IGZpbGVuYW1lKSAtLT4KPCEtLSB9IGVsc2UgeyAtLT4KPCEtLSAgIG1lZGlhbk12YWwuZGYgPC0gcmVhZFJEUyhmaWxlbmFtZSkgLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMjIyBUZXN0IGFsbCByZWdpb25zIC0tIGxpbmVhciByZWdyZXNzaW9ucyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBUUlVFfSAtLT4KPCEtLSAjIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgo8IS0tIGNvaG9ydCA8LSAiR2FzcGFyb25pIiAtLT4KPCEtLSBpbmZvX2RmIDwtIHJlYWRSRFMoZGlyKGRhdGEuZGlyLm1lZGlhbiwgcGF0dGVybiA9ICJpbmZvIiwgZnVsbC5uYW1lcyA9IFRSVUUpKSAtLT4KPCEtLSBtZWRpYW5zTXZhbF9kZiA8LSByZWFkUkRTKGRpcihkYXRhLmRpci5tZWRpYW4sIHBhdHRlcm4gPSAibWVkaWFuc012YWwiLCBmdWxsLm5hbWVzID0gVFJVRSkpIC0tPgo8IS0tIHBoZW5vX2RmIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLm5ldXJvbiwgIi9waGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMiKSkgIC0tPgoKPCEtLSAjIyMgQ2hlY2sgdmFyaWFibGVzIGJlZm9yZSBmaXR0aW5nIG1vZGVsIC0tPgo8IS0tIHBoZW5vX2RmJFNhbXBsZSA8LSBwaGVub19kZiRzYW1wbGUgLS0+CjwhLS0gaWRlbnRpY2FsKHBoZW5vX2RmJFNhbXBsZSwgY29sbmFtZXMobWVkaWFuc012YWxfZGYpKSAtLT4KCjwhLS0gcGhlbm9fZGYkc2V4IDwtIGFzLmZhY3RvcihwaGVub19kZiRzZXgpIC0tPgo8IS0tIHBoZW5vX2RmJHNsaWRlIDwtIGFzLmZhY3RvcihwaGVub19kZiRzbGlkZSkgLS0+CjwhLS0gIyBJZiByb3NtYXAgY29ob3J0LCBkb24ndCBmb3JnZXQgYmF0Y2ggZWZmZWN0IC0tPgoKPCEtLSBzdHIocGhlbm9fZGYpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gZGV2dG9vbHM6OnNvdXJjZV9naXN0KCJodHRwczovL2dpc3QuZ2l0aHViLmNvbS90aWFnb2Noc3QvZDNhN2IxNjM5YWNmNjAzOTE2YzMxNWQyM2IxZWZiM2UiKSAtLT4KCjwhLS0gcHJlZGljdG9yc19jaGFyIDwtICJzdGFnZSIgLS0+CjwhLS0gY292YXJpYXRlc19jaGFyIDwtIGMoImFnZS5icmFpbiIsICJzZXgiLCAicHJvcC5uZXVyb24iLCAic2xpZGUiKSAtLT4KCjwhLS0gcmVzX2RmIDwtIFRlc3RBbGxSZWdpb25zX25vSW5mbyggLS0+CjwhLS0gICBwcmVkaWN0b3JzX2NoYXIgPSBwcmVkaWN0b3JzX2NoYXIsIC0tPgo8IS0tICAgY292YXJpYXRlc19jaGFyID0gY292YXJpYXRlc19jaGFyLCAtLT4KPCEtLSAgIHBoZW5vX2RmID0gcGhlbm9fZGYsIC0tPgo8IS0tICAgc3VtbWFyaXplZFJlZ2lvbnNfZGYgPSBtZWRpYW5zTXZhbF9kZiAtLT4KPCEtLSApIC0tPgoKPCEtLSBjb2xuYW1lcyhyZXNfZGYpIDwtIGMoIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9lc3RpbWF0ZSIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfc2UiKSwgLS0+CjwhLS0gICBwYXN0ZTAoY29ob3J0LCAiX3BWYWwiKSwgLS0+CjwhLS0gICBwYXN0ZTAoY29ob3J0LCAiX2ZkciIpIC0tPgo8IS0tICkgLS0+Cgo8IS0tIHJlc193aXRoSW5mb19kZiA8LSBjYmluZChpbmZvX2RmLCByZXNfZGYpIC0tPgoKPCEtLSBzYXZlUkRTKCAtLT4KPCEtLSAgIHJlc193aXRoSW5mb19kZiwgLS0+CjwhLS0gICBwYXN0ZTAoZGF0YS5kaXIubWVkaWFuLCAgY29ob3J0LCAiX2xpbmVhcl9kZi5yZHMiKSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIGZpbGUgPC0gZGlyKGRhdGEuZGlyLm1lZGlhbixwYXR0ZXJuID0gcGFzdGUwKCIuKmxpbmVhcl9kZiIpLCAtLT4KPCEtLSAgICAgICAgICAgICByZWN1cnNpdmUgPSBULCAtLT4KPCEtLSAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSwgLS0+CjwhLS0gICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBUKSAtLT4KPCEtLSBmaWxlIC0tPgo8IS0tIHJlc193aXRoSW5mb19kZiA8LSByZWFkUkRTKGZpbGUpIC0tPgo8IS0tIGRpbShyZXNfd2l0aEluZm9fZGYpIC0tPgo8IS0tIHJlc193aXRoSW5mb19kZiAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMgRGF0YSBmaW5hbCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIGRpcihwYXRoID0gZGF0YS5kaXIscmVjdXJzaXZlID0gVCwgcGF0dGVybiA9ICIucmRhfC5jc3Z8LlJEUyIpIC0tPgo8IS0tIGBgYCAtLT4KCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgpgYGB7Un0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYAo=